Русская документация PHP-CPP

Чтение и установка настроек php.ini

Чтение ini-записей

Чтение настроек из php.ini так же просто, как в обычном PHP скрипте. В вашем PHP-скрипте вы используете встроенную функцию ini_get() для чтения настроек из php.ini, а в файл PHP-CPP расширении нужно использовать функцию Php::ini_get().

#include <phpcpp.h>

/**
 *  Простая функция, демонстрирующая чтение настроек из файла php.ini
 */
void myFunction()
{
    // read in the "output_buffering" variable from the php.ini file
    int output_buffering = Php::ini_get("output_buffering");
    
    // read in the "variables_order" variable
    std::string variables_order = Php::ini_get("variables_order");
}
//...

Функция Php::ini_get() возвращает объект Php::IniValue, который может быть присвоен переменным основных скалярных типов — строке, целому числу, логическому типу (bool) или числу с плавающей точкой. В приведенном выше примере мы имеем использовали это, чтобы присвоить параметры непосредственно целому числу и строке std::string. Так же объект может быть направлен в выходной поток std::ostream:

Php::out << "ini_get(ini_entry) = " << Php::ini_get("ini_entry") << std::endl;

Функция Php::ini_get_orig(const char* name) предназначена для получения оригинальных значений ini-записей, В том случае, если они могли быть изменены в пользовательском скрипте функцией ini_set().

Вы можете считывать ini-записи до того, как ваше расширение загружено в ядро PHP на этапе его формерования. Таким образом, можно использовать ini-настройки для конфигурирования вашего расширения. Сказанное иллюстрирует следующий пример:
#include <phpcpp.h>

// Будет инициировано в момент загрузки расширения
double inival = 0.0;

void iniTest()
{
    Php::out << "ini6val = " << ini6val << std::endl;
}

extern "C" {
    /**
     *  The get_module() startup function
     *  @return void*
     */
    PHPCPP_EXPORT void *get_module() {
        
        // create extension object
        static Php::Extension extension("my_extension", "0.1");
        
        // export one function
        extension.add("iniTest", iniTest);

        extension.onStartup([](){
            // Retrieve a value at boot extension
            inival = Php::ini_get("my_extension.inival");
        });
        
        // return a pointer to the extension object
        return extension;
    }
}

Установка ini-записей

Если вы хотите определить для своего расширения собственные ini-настройки, то вы должны их явно зарегистрировать в get_module().

#include <phpcpp.h>

/**
 *  Простая функция, демонстрирующая чтение настроек из файла php.ini
 */
void myFunction()
{
    // read in the "output_buffering" variable from the php.ini file
    int output_buffering = Php::ini_get("output_buffering");
    
    // read in the "variables_order" variable
    std::string variables_order = Php::ini_get("variables_order");
}

/**
 *  Switch to C contect so that the get_module() function can be
 *  called by the Zend engine
 */
extern "C" {
    /**
     *  The get_module() startup function
     *  @return void*
     */
    PHPCPP_EXPORT void *get_module() {
        
        // create extension object
        static Php::Extension extension("my_extension", "1.0");
        
        // export one function
        extension.add("myFunction", myFunction);
        
        // Регистрируем ini-настройки
        extension
            .add(Php::Ini("my_extension.ini1", "valIni1"))
            .add(Php::Ini("my_extension.ini2", "valIni2", "OrigValIni2"))
            .add(Php::Ini("my_extension.ini3", "valIni3", "OrigValIni3", Php::Ini::System))
            .add(Php::Ini("my_extension.ini4", true,      false, Php::Ini::Place::User))
            .add(Php::Ini("my_extension.ini5",            false));
        
        Php::Ini ini6("my_extension.ini6", 55, 11);
        extension
            .add(ini6)
            .add(Php::Ini("my_extension.ini7", 74,5));
        
        Php::Ini ini8("my_extension.ini8", 3.1415926, 6.2831852);
        Php::Ini ini9("my_extension.ini9", 2.7182818, 5.4365636, Php::Ini::User);
        
        extension.add(ini8);
        extension.add(std::move(ini9));
        
        // return a pointer to the extension object
        return extension;
    }
}

В приведенном выше примере мы видим, что для регистрации ini-настроки мы создали объект класса Php::Ini и добавили его в расширение с помощью метода Php::Extension::add().

Класс Php::Ini имеет два конструктора со следующими протатипами:

Ini(const char *name, T value, T orig_value, const Place place = Place::All);
Ini(const char *name, T value, const Place place = Place::All);
Здесь name — имя ini-записи.
T — один из скалярных типов C++.
value — значение ini-записи.
orig_value — оригинальное значение ini-записи (может быть извлечено с помощью Php::ini_get_orig).
Php::Ini::Place — перечисление определяющее место, в котором ini-запись может быть изменена пользователем.
place может принимать одно из следующих значений: Php::Ini::User, Php::Ini::Perdir, Php::Ini::System и Php::Ini::All.

Что означают эти константы см. соответствующую страницу руководства PHP:
Php::Ini::User (PHP_INI_USER) — Значение может быть изменено в пользовательских скриптах (с помощью ini_set()). С версии PHP 5.3 значение может быть установлено в .user.ini.
Php::Ini::Perdir (PHP_INI_PERDIR) — Значение может быть изменено в php.ini, .htaccess или httpd.conf (С версии PHP 5.3).
Php::Ini::System (PHP_INI_SYSTEM) — Значение может быть изменено в php.ini или httpd.conf.
Php::Ini::All (PHP_INI_ALL) — Значение может быть изменено отовсюду.
Установка PHP-CPP Загрузка расширений Ваше первое расширение Вывода и ошибок Функции Параметры Вызов функций и методов Классы и объекты Конструкторы и деструкторы Наследование Магические методы Магические интерфейсы Генерация исключений Специальные возможности Поля классов Работа с переменными ini записи Extension callbacks Пространства имен