четверг, 19 февраля 2015 г.

Php 5.5 & Apache 2.4

Апач ставлю из репозитариев, пхп собирается из сорцов.

Настраиваем конфигурацию пхп, указываем путь к apsx2. Для этого нужно установить apache2-dev.
Компилим пхп, ставим его.

После  установки может появиться ошибка: Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.
Тогда надо скомпилить пхп с --enable-maintainer-zts или поставить апачу mpm_prefork

make install добавит загрузку модуля пхп к апачу ( mods-available/php5.load )
Остается только добавить SetHandler

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

В Апаче 2.4  реализована загрузка модулей путем подгрузки всех файлов из /etc/apache2/mods-enable
Добаляются они туда из mos-available с помощью команд a2enmods. Создаем для модуля php5  конфиг файл (mods-available/php5.conf) и добавляем туда SetHandler.
выклчаем/включаем модуль, файл конфига копируется в mods-enable. Осталось рперезагрузить Апач: 
service apache2 restart


среда, 2 апреля 2014 г.

PHP extension на с++

По умолчанию extension создается для компиляции с-компилятором. Для переключения на с++ есть такой вариант:
1)vim config.m4
2) в блок if test "$PHP_GT_TEST" != "no"; then
  добавить:
  PHP_REQUIRE_CXX()
  PHP_SUBST(GT_TEST_SHARED_LIBADD)
  PHP_ADD_LIBRARY(stdc++, 1, GT_TEST_SHARED_LIBADD)
3) В PHP_NEW_EXTENSION(ext, ext.c, $ext_shared)
поменять ext.c => ext.cc
4) phpize

Создать php extension в unix

Шаги:
1) cd /path_to_php_src/ext
2) ./ext_skel --extname=name
3) cd name
4) vim config.m4, там убрать dnl со строк:
dnl PHP_ARG_ENABLE(gt_test, whether to enable gt_test support,
dnl Make sure that the comment is aligned:
dnl [  --enable-gt_test           Enable gt_test support])
или со строк
dnl PHP_ARG_WITH(gt_test, for gt_test support,
dnl Make sure that the comment is aligned:
dnl [  --with-gt_test             Include gt_test support])
5) phpize
6) ./configure && make && make install

понедельник, 31 марта 2014 г.

Немного установки php

  Configuration File (php.ini) Path => /etc/php5/apache2
  Loaded configuration file => (none)

Если php в упор не видит свой ini file, хотя при компиляции ему ясно указали
  --with-config-file-path=/etc/php5/php.ini
то все просто, надо указывать папку, а не сам файл. Как-то так:
  --with-config-file-path=/etc/php5
и тогда он сам найдет там php.ini

среда, 12 февраля 2014 г.

В mysql записываются знаки вопроса вместо русского

Внезапно, встретился с такой проблемой. Из c++ передавался русский в кодировке windows-1251, таблица - cp1251_general_ci, а записываются все равно ????? Решение оказалось просто - надо после установки соединения 1 раз вызвать:
  mysql_query(conn, "SET NAMES cp1251");

вторник, 11 февраля 2014 г.

Идентификация пользователя

Стал разбираться, как бы точнее идентифицировать пользователя, нашел неплохую статью:
http://javascript.ru/unsorted/id Оставлю тут ссылку, чтобы не потерять.
Сайт, который использует это:
https://panopticlick.eff.org/index.php

понедельник, 3 февраля 2014 г.

Множественные запросы к MySQL

Множественный запрос к MySQL - это запрос, содержащий несколько выражений, записанных через ; Для того, чтобы его провести, при установке соединения нужно указать флаг CLIENT_MULTI_STATEMENTS. Как-то вот так:

mysql_real_connect(mysql, host, user, pwd, db, port, socket, CLIENT_MULTI_STATEMENTS);

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

Получаются они функцией mysql_store_result, как обычно. Но она будет вызываться ко всем выражениям по очереди. Пролистывать результаты выполнения можно функцией mysql_next_result.
В итоге: вызовом mysql_next_result пропускаем выражения, ничего не возвращающие, у возвращающих - забираем данные с помощью mysql_store_result:

if (mysql_query(mysql, "CALL my_proc(@a, @b); SELECT @a, @b;") != NULL) {
  if (mysql_next_result(mysql)) > 0)
    cout << "mysql_next_result error" << endl;
    MYSQL_RES *result = mysql_store_result(mysql);
    if (result) {
      ...
      mysql_free_result(result);
    }
    else
      cout << "mysql_store_result error" << endl;
  }
else 
  cout << "mysql_query error" << endl;

Если неизвестно, возвращает ли что-нибудь выражение - можно проверить командой mysql_field_count.

Информация - из документации.