Техническая документация
PHP: использование программ на языке PHP
Пользователям хостинга предоставляется возможность использовать на своих
сайтах программы на языке PHP(в соответствии с тарифным
планом). У нас установлена одна из последних версий PHP и мы стараемся по мере возможности ее обновлять. Текущую конфигурацию можно посмотреть при
помощи функции phpinfo().
Пример скрипта для просмотра конфигурации PHP:
<?
phpinfo();
?>
Что такое PHP и как начать с ним работать
PHP: Hypertext Preprocessor — очень простой
даже для начинающего веб-программиста язык, который, тем не менее, обладает
очень серьезными возможностями. PHP — язык достаточно высокого уровня, что позволяет просто реализовывать на нем именно веб-проекты, не заботясь при этом о ненужных низкоуровневых процессах. Если вы хотите добавить динамику и интерактив на свой сайт, но при этом не хотите изучать более сложные языки вроде Perl, можно использовать PHP. Этот язык также содержит большое количество встроенных возможностей для работы с популярной СУБД MySQL, что делает выбор PHP для веб-программирования еще более привлекательным.
Начать использовать PHP очень просто: нужно создать в веб-пространстве файл с расширением *.php и поместить в него нужные PHP-инструкции. Например, создадим файл test.php в каталоге www вашего домена и поместим в него следующий текст:
<?
echo "Hello, world! This is my first program with PHP!"
?>
Теперь откройте страницу http://www.ваш_домен.ru/test.php и вы увидите результат выполнения скрипта. PHP — это просто. Простоты этому языку добавляет наличие отличной документации на русском языке, которая доступна здесь. Есть отличный поиск по документации, примеры использования функций, а также прямо на сайте вы можете почитать рекомендации пользователей PHP по применению конкретных возможностей.
Поддерживаемые на нашем хостинге функции
Мы используем одну из последних версий PHP в виде модуля для веб-сервера Apache, которая собрана с поддержкой следующих модулей (функций):
- mysql
- ftp
- dbase
- gdbm
- ndbm
- xslt
- xslt-sablot
- iconv
- gd
- gd-native-ttf
- ttf
- zlib
- jpeg
- png
Также пользователь может скомпилировать свой собственный бинарный файл PHP, о чем написано ниже, и использовать его в cgi-режиме.
Расширения файлов для PHP-скриптов, как добавить свое расширение
Интерпретатором PHP автоматически обрабатываются как PHP-сценарии файлы со следующими расширениями:
То есть, файлы, имеющие такие расширения, будут автоматически обрабатываться веб-сервером как PHP-скрипты. Например, index.php или 123.phtml. Пользователь может самостоятельно добавить собственные расширения для обработки соответствующих файлов как PHP-сценариев, поместив в файл .htaccess строку вида:
AddType application/x-httpd-php .ext1 .php3
где ext1 и php3 — добавляемые расширения в названии файлов. Например, в данном случае PHP-скриптами будут считаться файлы index.ext1 и file.php3.
Отправка писем с вложениями при помощи функции mail
Ссылки на готовые примеры скриптов, использующих функцию mail для отправки писем свложениями, есть в документации на сайте разработчика: LII. Mail Functions.
Ошибка форума phpBB: Critical error. Error creating new session
Данная неработоспособность связана с "дыркой" в самом форуме phpbb.
Cостоит она в том, что форум хранит в БД все сессии, не удаляя их, или удаляя с такой периодичностью, что, в конце концов, таблица сессий переполняется и форум выдаёт ошибку "phpBB: Critical error. Error creating new session", т.к. не может работать дальше с таким количеством сессий.
Чтобы устранить ошибку выполните следующее:
- 1. откройте корневую директорию форума
- 2. откройте файл includes/sessions.php
- 3. найдите строку 152
- 4. замените эту строку
message_die(CRITICAL_ERROR,
'Error creating new session', '', __LINE__,
__FILE__, $sql);
на следующие:
$error = TRUE;
if (SQL_LAYER == "mysql" || SQL_LAYER == "mysql4")
{
$sql_error = $db->sql_error($result);
if ($sql_error["code"] == 1114)
{
$result = $db->sql_query('SHOW TABLE STATUS
LIKE "'.SESSIONS_TABLE.'"');
$row = $db->sql_fetchrow($result);
if ($row["Type"] == "HEAP")
{
if ($row["Rows"] > 2500)
{
$delete_order = (SQL_LAYER=="mysql4") ? "
ORDER BY session_time ASC" : "";
$db->sql_query("DELETE QUICK FROM ".
SESSIONS_TABLE."$delete_order LIMIT 50");
}
else
{
$db->sql_query("ALTER TABLE ".
SESSIONS_TABLE." MAX_ROWS=".($row["Rows"]+50));
}
if ($db->sql_query($sql))
{
$error = FALSE;
}
}
}
}
if ($error)
{
message_die(CRITICAL_ERROR, "Error creating new
session", "", __LINE__, __FILE__, $sql);
}
- 5. сохраните файл и скопируйте на сервер, записав поверх существующего.
Теперь вы можете не волноваться за переполнение таблицы сессий в базе данных форума phpBB.
Проблемы работы функций strtoupper() и strtolower() с кириллицей
Проблемы при работе с кириллицей в PHP-скриптах функций strtoupper() и strtolower() возникают, когда неправильно определена текущая локаль (locale). Для правильного её определения следует воспользоваться функцией setlocale() в самом начале вашего PHP-сценария:
<?php
setlocale(LC_ALL, 'ru_RU.CP1251');
echo strtoupper('Работает!');
?>
Возможности изменения конфигурации PHP для пользователя
Внимание! В случае изменения конфигурации PHP или сборки собственного интерпретатора предварительно необходимо определить, какая версия операционной системы установлена на сервере, где находится ваша площадка. В настоящее время происходит постепенный процесс миграции с ОС FreeBSD 4.1 на ОС FreeBSD 6.1. В зависимости от этого вам нужно использовать ту или иную версию конфигурационного файла или интерпретатора PHP, ниже обращайте внимание на различие в путях к файлам для разных версий ОС.
Для того, чтобы узнать текущую версию ОС на вашем сервере, выполните команду:
uname -a
Версия ОС будет указана в выводе данной команды:
FreeBSD 4.11-RELEASE-p13
или
FreeBSD 6.1-RELEASE-p10
Очень часто пользователю требуется так или иначе изменить настройки PHP для работы со скриптами. Существует два возможных варианта.
Случай 1. необходимо внести изменения на уровне компиляции (сборки) PHP (добавление модулей, изменение системных опций PHP_INI_SYSTEM).
Случай 2. достаточно изменить значение одной или нескольких опций, имеющих статус изменяемости PHP_INI_PERDIR или PHP_INI_ALL.
Напомним значение и расшифровку констант PHP_INI_*:
| PHP_INI_USER | 1 | Опция может быть установлена в пользовательских скриптах |
| PHP_INI_PERDIR | 2 | Опция может быть установлена в php.ini, .htaccess или httpd.conf |
| PHP_INI_SYSTEM | 4 | Опция может быть установлена в php.ini или httpd.conf |
| PHP_INI_ALL | 7 | Опция может быть установлена где угодно |
Список, описание и статус изменяемости директив можно найти в
приложении G документации PHP.
В первом случае, когда нам нужно изменить конфигурацию PHP добавлением новых модулей (imap, templates, curl), с которыми не собран наш модульный PHP. Если это так, необходимо собрать свой PHP. После сборки рекомендуется скопировать наш INI-файл
Для FreeBSD 4.1:
/usr/local/apache-php4/php/php-cgi.ini
или
/usr/local/apache-php4/php/php-cli.ini
Для FreeBSD 6.1
/usr/local/php5/etc/php-cgi.ini
или
/usr/local/php5/etc/php-cli.ini
в зависмости от вида используемого SAPI-интерфейса (cgi или cli).
Во втором случае, когда не требуется использование каких-либо дополнительных модулей, а необходимо лишь изменить значение управляемых в php.ini директив — следует просто скопировать уже собранный исполняемый файл php-SAPI на площадку и произвести необходимые действия с .htaccess.
Для FreeBSD 4.1:
/usr/local/apache-php4/bin/php-cgi
или
/usr/local/apache-php4/bin/php-cli
Для FreeBSD 6.1:
/usr/local/php5/bin/php-cgi
или
/usr/local/php5/bin/php-cli
в зависмости от вида используемого SAPI-интерфейса.
В случае, если установленные значения директив в наших INI-файлах совпадают с желаемыми — копировать INI-файл не нужно. В частности, такие действия проводятся, когда требуется увеличить значение memory_limit для PHP. Если предполагается изменение директив в php-SAPI.ini — его следует скопировать, подобно описанному выше способу.
Для FreeBSD 4.1:
ls /usr/local/apache-php4/php/php-*.ini |
awk '{print $1}' | xargs grep memory_limit
/usr/local/apache-php4/php/php-cgi.ini:
memory_limit = 32M
/usr/local/apache-php4/php/php-cli.ini:
memory_limit = 32M
Для FreeBSD 6.1:
ls /usr/local/php5/etc/php-*.ini |
awk '{print $1}' | xargs grep memory_limit
/usr/local/php5/etc/php-cgi.ini:
memory_limit = 32M
/usr/local/php5/etc/php-cli.ini:
memory_limit = 32M
Обратите особое внимание на то, что если в результате добавления своей директивы вы получили ошибку или не получили желаемого результата, то есть вероятность того, то конфигурирование соответствующего параметра просто недоступно на этом уровне. Если это так, попробуйте собрать свой PHP, но предварительно, пожалуйста, уточните у нашей технической поддержки действительно ли в этой ситуации вам нужен собственный PHP.
Как собрать свой собственный интерпретатор PHP
Внимание! В случае изменения конфигурации PHP или сборки собственного интерпретатора предварительно необходимо определить, какая версия операционной системы установлена на сервере, где находится ваша площадка. В настоящее время происходит постепенный процесс миграции с ОС FreeBSD 4.1 на ОС FreeBSD 6.1. В зависимости от этого вам нужно использовать ту или иную версию конфигурационного файла или интерпретатора PHP, ниже обращайте внимание на различие в путях к файлам для разных версий ОС.
Для того, чтобы узнать текущую версию ОС на вашем сервере, выполните команду:
uname -a
Версия ОС будет указана в выводе данной команды:
FreeBSD 4.11-RELEASE-p13
или
FreeBSD 6.1-RELEASE-p10
Для того, чтобы собрать свой собственный интерпретатор PHP сначала нужно получить доступ к unix shell. Далее, зайдя в unix shell, действуйте по следующему алгоритму:
Если все работает, то каталог $HOME/php-5.1.6 можно удалить:
cd; rm -rf php-5.1.6
Как подключить модуль templates к интерпретатору PHP
Для установки модуля templates необходимо установить собственный интерпретатор PHP.
-
В домашней директории создаем поддиректорию для временного хранения исходных текстов интерпретатора PHP.
Создаем каталог с названием src командой mkdir src и заходим в него выполнив команду cd src :
$ mkdir src
$ cd src
- Скачиваем с сайта разработчиков дистрибутив PHP:
$ wget http://ru.php.net/get/php-5.1.6.tar.bz2/from/this/mirror
- Распаковываем архив, переходим в каталог расширений:
$ tar -xjvf php-5.1.6.tar.bz2
$ cd php-5.1.6/еxt
- Скачиваем дистрибутив php-templates:
$ wget \
http://surfnet.dl.sourceforge.net/sourceforge
/php-templates/php_templates-1.7.2.tar.gz
- Распаковываем архив в текущую директорию:
$ tar xzfv php_templates-1.7.2.tar.gz
$ cd templates/
-
Выполняем следующий скрипт, которые удалит ненужные символы возврата каретки в файлах дистрибутива модуля:
$ for f in *; do cp $f $f.old; cat $f.old
| tr -d "\r" > $f; rm $f.old; done
- Переходим в директорию PHP:
$ cd ../../
-
Выполняем:
$ autoconf259
$ chmod 775 ./
-
Используя команду ./configure выполняем предварительную конфигурацию PHP для дальнейшей компиляции. Выполнив команду ./configure --help | more вы увидите полный список возможных опций, из которых вам нужно выбрать нужные.
Пример конфигурации:
./configure --prefix=/home/uXXXXX/php \
--with-mysql=/usr/local --enable-ftp \
--enable-dbase --with-gdbm \
--with-ndbm --enable-xslt --with-xslt-sablot \
--with-iconv=/usr/local --with-expat-dir=/usr/local \
--with-gd=/usr/local \
--enable-gd-native-ttf=/usr/local \
--with-jpeg-dir=/usr/local \
--with-png-dir=/usr/local \
--with-freetype-dir=/usr/local --with-ttf \
--with-zlib-dir=/usr \ --enable-memory-limit \
--disable-posix \ --enable-force-cgi-redirect \
--enable-track-vars --disable-syntax-hl \
--enable-inline-optimization \ --without-pear \
--disable-debug --enable-templates
-
Запускаем компиляцию и последующую установку уже сконфигурированного PHP:
$ gmake
$ gmake install
- По завершению процессов сборки и установки в каталоге php/bin/ вы найдете исполняемый бинарный файл php, собранный с модулем templates
$ cd ~/php/bin/
$ ./php -m
[PHP Modules]
ctype
dba
dbase
ftp
gd
iconv
mysql
overload
pcre
session
standard
templates
tokenizer
xml
xslt
zlib
Дальнейшие действия по использованию собранного бинарного файла были описаны выше.
Установка Zend Optimizer
Обратите внимание, на наших виртуальных серверах можно установить Zend Optimizer только до версии 2.6.0 включительно.
Для установки Zend Optimizer необходимо установить собственный интерпретатор PHP.
- Скачиваем с сайта разработчиков дистрибутив.
- Распаковываем закачанный архив Zend Optimizer в среде unix shell:
tar -zxf ZendOptimizer-2.6.0-freebsd4.3-i386.tar.gz
- Редактируем install.sh:
находим вызов функции check_root_permissions() и комментируем его:
#check_root_permissions
# Go to the package directory:
if [ ! -d $INSTALL_DIR ]; then
cd `dirname $0` 2> /dev/null
fi
- Запускаем установку Zend Optimizer:
./install.sh
- При установке будут вопросы, отвечать так:
- Specify the location where to install Zend Optimizer:
/home/Client_ID/zend
- Confirm the location of your php.ini file
/home/Client_ID/cgi-bin/
- Are you using Apache Web server?
NO
- Проверяем:
bash-2.05b$ ./php -m
[PHP Modules]
Zend Optimizer
[Zend Modules]
Zend Extension Manager
Zend Optimizer
Как выполнять PHP-скрипты в заданное время по расписанию
Иногда у PHP-программистов возникают задачи, которые требуют запуска PHP-скриптов в указанное время. Например, загрузка прайс-листа в базу данных, создание/удаление файлов на диске сервера, загрузка на сервер документов с других серверов и так далее. Можно использовать для этого возможности программы cron, которая работает на сервере.
Подробности о работе cron и его использовании вы найдете в отдельном документе. Здесь же мы опишем тонкости запуска таким образом именно PHP-скриптов.
На наших серверах установлен бинарный файл интерпретатора PHP, который можно вызывать из cron. Полный путь к нему — /usr/local/apache-php4/bin/php-cli. В качестве параметра нужно передать полный путь до запускаемого PHP-скрипта. Пример задания для cron:
0 1 * * * /usr/local/apache-php4/bin/php-cli /home/Client_ID/www/script.php
или
0 1 * * * /usr/local/php5/bin/php-cli /home/Client_ID/www/script.php
в случае с PHP 5.
В данном примере скрипт, который находится на диске сервера и имеет полный путь /home/Client_ID/www/script.php, запускается в 1 час ночи каждый день. Не забывайте нажимать Enter после каждой строки в cron — все строки в сценариях cron должны заканчиваться переводом строки или задание работать не будет.
Ограничения
Нужно учитывать, что на работу PHP налагаются некоторые ограничения. По соображениям безопасности мы запретили использование следующих команд:
- dl
- shell_exec
- exec
- system
- passthru
- popen
- proc_open
- proc_nice
- proc_get_status
- proc_close
- proc_terminate
- posix_mkfifo
- set_time_limit
В случае, если какие-то из этих команд все же однозначно вам необходимы, можно собрать собственный бинарный файл PHP и использовать его в cgi-режиме. Если же на самом деле вы хотите использовать функции вроде exec для выполнения периодических заданий вроде бэкапа баз MySQL, пожалуйста, используйте для этого cron. Если же нужно разово выполнить какую-то команду, можно использовать для этого unix shell.
Документация и полезные ссылки
В помощь вам мы приводим ссылки на полезные ресурсы по тематике PHP: