×
Техническая документация: Хостинг

PHP: использование программ на языке PHP

Пользователям хостинга предоставляется возможность использовать на своих сайтах программы на языке PHP (в соответствии с тарифным планом). У нас установлена одна из последних версий PHP и мы стараемся по мере возможности ее обновлять. Текущую конфигурацию можно посмотреть при помощи функции phpinfo().

Пример скрипта для просмотра конфигурации PHP:

<?php
phpinfo();
?>

Что такое PHP и как начать с ним работать

PHP: Hypertext Preprocessor — очень простой даже для начинающего веб-программиста язык, который, тем не менее, обладает очень серьезными возможностями. PHP — язык достаточно высокого уровня, что позволяет просто реализовывать на нем именно веб-проекты, не заботясь при этом о ненужных низкоуровневых процессах. Если вы хотите добавить динамику и интерактив на свой сайт, но при этом не хотите изучать более сложные языки вроде Perl, можно использовать PHP. Этот язык также содержит большое количество встроенных возможностей для работы с популярной СУБД MySQL, что делает выбор PHP для веб-программирования еще более привлекательным.

Начать использовать PHP очень просто: нужно создать в веб-пространстве файл с расширением *.php и поместить в него нужные PHP-инструкции. Например, создадим файл test.php в каталоге www вашего домена и поместим в него следующий текст:

<?php
echo "Hello, world! This is my first program with PHP!"
?>

Теперь откройте страницу http://www.ваш_домен.ru/test.php и вы увидите результат выполнения скрипта. PHP — это просто. Простоты этому языку добавляет наличие отличной документации на русском языке, которая доступна здесь. Есть отличный поиск по документации, примеры использования функций, а также прямо на сайте вы можете почитать рекомендации пользователей PHP по применению конкретных возможностей.

Поддерживаемые на нашем хостинге функции

Мы используем одну из последних версий PHP в виде модуля для веб-сервера Apache, которая собрана с поддержкой следующих модулей (функций):

  • bcmath
  • calendar
  • ctype
  • curl
  • date
  • dba
  • dom
  • ereg
  • filter
  • ftp
  • gd
  • gettext
  • hash
  • iconv
  • imap
  • json
  • libxml
  • mbstring
  • mcrypt
  • mhash
  • mysql
  • mysqli
  • mysqlnd
  • openssl
  • pcre
  • PDO
  • pdo_mysql
  • Reflection
  • session
  • SimpleXML
  • SPL
  • standard
  • tokenizer
  • xml
  • xmlreader
  • xmlwriter
  • xsl
  • zip
  • zlib

Также пользователь может скомпилировать свой собственный бинарный файл PHP, о чем написано ниже, и использовать его в cgi-режиме.

Расширения файлов для PHP-скриптов, как добавить свое расширение

Интерпретатором PHP автоматически обрабатываются как PHP-сценарии файлы со следующими расширениями:

  • *.php
  • *.phtml

То есть, файлы, имеющие такие расширения, будут автоматически обрабатываться веб-сервером как PHP-скрипты. Например, index.php или 123.phtml. Пользователь может самостоятельно добавить собственные расширения для обработки соответствующих файлов как PHP-сценариев, поместив в файл .htaccess строку вида:

AddType application/x-httpd-php .ext1 .php3 .html
где ext1, php3 и .html — добавляемые расширения в названии файлов. Например, в данном случае PHP-скриптами будут считаться файлы index.ext1, file.php3 и test.html.

Отправка писем с вложениями при помощи функции mail

Ссылки на готовые примеры скриптов, использующих функцию mail для отправки писем с вложениями, есть в документации на сайте разработчика: LII. Mail Functions.

Авторизованная отправка писем с серверов виртуального UNIX-хостинга

В целях безопасности, на всех серверах виртуального UNIX-хостинга заблокированы исходящие соединения на 25 порт, поэтому необходимо использовать альтернативный номер порта, который нужно уточнить у владельца SMTP-сервера. Если отправка будет осуществляться через наш SMTP-сервер, используйте порт 2525.

Пример авторизованной отправки почты с использованием smtp-сервера.


<?php

 $mhSmtpMail_Server     "smtp.domain.tld";       // Укажите адрес SMTP-сервера
 $mhSmtpMail_Port       "2525";                  // Порт SMTP-сервера.
 $mhSmtpMail_Username   "postmaster@domain.tld"// Имя почтового ящика (пользователя)
 $mhSmtpMail_Password   "password";              // и пароль к нему.
 $mhSmtpMail_From       "Имя отправителя";       // Имя отправителя в поле From

function MailSmtp($to$subject$message$headers)

{

  global $mhSmtpMail_Server$mhSmtpMail_Port$mhSmtpMail_Username$mhSmtpMail_Password;


  $mhSmtpMail_localhost  "localhost";
  $mhSmtpMail_newline    "\r\n";
  $mhSmtpMail_timeout    "30";

  $smtpConnect fsockopen($mhSmtpMail_Server$mhSmtpMail_Port$errno$errstr$mhSmtpMail_timeout);

  $smtpResponse fgets($smtpConnect515);

  if(empty($smtpConnect))
    {
      $output "Failed to connect: $smtpResponse";

      return $output;
    }
  else
    {
      $logArray['connection'] = "Connected: $smtpResponse";
    }
    
  fputs($smtpConnect"HELO $mhSmtpMail_localhost$mhSmtpMail_newline);
  $smtpResponse fgets($smtpConnect515);
  $logArray['heloresponse'] = "$smtpResponse";

  fputs($smtpConnect,"AUTH LOGIN" $mhSmtpMail_newline);
  $smtpResponse fgets($smtpConnect515);
  $logArray['authrequest'] = "$smtpResponse";

  fputs($smtpConnectbase64_encode($mhSmtpMail_Username) . $mhSmtpMail_newline);
  $smtpResponse fgets($smtpConnect515);
  $logArray['authmhSmtpMail_username'] = "$smtpResponse";

  fputs($smtpConnectbase64_encode($mhSmtpMail_Password) . $mhSmtpMail_newline);
  $smtpResponse fgets($smtpConnect515);
  $logArray['authmhSmtpMail_password'] = "$smtpResponse";

  fputs($smtpConnect"MAIL FROM: $mhSmtpMail_Username$mhSmtpMail_newline);
  $smtpResponse fgets($smtpConnect515);
  $logArray['mailmhSmtpMail_fromresponse'] = "$smtpResponse";

  fputs($smtpConnect"RCPT TO: $to$mhSmtpMail_newline);
  $smtpResponse fgets($smtpConnect515);
  $logArray['mailtoresponse'] = "$smtpResponse";

  fputs($smtpConnect"DATA" $mhSmtpMail_newline);
  $smtpResponse fgets($smtpConnect515);
  $logArray['data1response'] = "$smtpResponse";

  fputs($smtpConnect"Subject: $subject\r\n$headers\r\n\r\n$message\r\n.\r\n");
  $smtpResponse fgets($smtpConnect515);
  $logArray['data2response'] = "$smtpResponse";

  fputs($smtpConnect,"QUIT" $mhSmtpMail_newline);
  $smtpResponse fgets($smtpConnect515);
  $logArray['quitresponse'] = "$smtpResponse";

}

?>

Скачать пример готового скрипта с функцией MailSmtp(): smtpauth.php.sample

Использовать описанную выше функцию MailSmtp() можно для прямой замены функции mail(). Рассмотрим пример самой простой формы на PHP:


<?

if ($_POST['submit'])

 {

  $to      $_POST['to'];
  $subject $_POST['subj'];
  $message $_POST['msg'];

  
  // Заголовки сообщения, в них определяется кодировка сообщения, поля From, To и т.д.
  $headers "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/html; charset=windows-1251\r\n";
  $headers .= "To: $to\r\n";
  $headers .= "From: Имя отправителя <postmaster@domain.tld>";

  
//  mail ($to, $subject, $message, $headers);
 
  require_once "smtpauth.php";
  MailSmtp ($to"=?windows-1251?B?".base64_encode($subject)."?="$message$headers);

}


?>

<form action="" method="post">
  <pre>
    To:   <input type="text" name="to">
    Subj: <input type="text" name="subj">

    Msg:  <input type="text" name="msg">
    <input type="submit" value="Send mail!" name="submit">
  </pre>
</form>    

Для того, что бы данная форма заработала без функции mail() мы включили файл smtpauth.php через require_once и вызвали функцию MailSmtp(), описанную в нем, с аналогичными для mail() аргументами. При этом сам вызов mail() мы закомментировали в коде, что бы избежать ошибки при выполнении скрипта.

Отправка писем при помощи функции mail()

В следующим примере мы воспользуемся встроенной функцией mail(), где в качестве параметров, клиентские данные будут переданы посредством $_POST запроса.


<?php
if ($_POST['submit'])
 {
  $from    $_POST['from'];
  $to      $_POST['to'];
  $subject $_POST['subj'];
  $message $_POST['msg'];
  $headers "From: $from\r\n";
  $headers .= "MIME-Version: 1.0\r\n";
  $headers .= "Content-Type: text/plain; charset=windows-1251\r\n"."Content-Transfer-Encoding: 8bit\r\n";
  mail($to"=?windows-1251?B?".base64_encode($subject)."?="$message$headers"-f ".$from);
}
?>

<form action="" method="post">
  <pre>
    From:   <input type="text" name="from">
    To:   <input type="text" name="to">
    Subj: <input type="text" name="subj">
    Msg:  <input type="text" name="msg">
    <input type="submit" value="Send mail!" name="submit">
  </pre>
</form>
    

Ошибка форума 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('Работает!');

?>

Поиск с помощью Яндекс.XML

Если вы решили воспользоваться сервисом Яндекс.XML, то прежде всего вам потребуется выделенный IP-адрес, который вы можете добавить для любого домена в личном кабинете: в меню Древо услуг > Домен, напротив характеристики «выделенный IP/SSL» нажмите «добавить» (в данном случае подключать SSL не обязательно, но в комментариях обязательно укажите причину, по которой вам понадобился выделенный IP-адрес).

Далее для организации запроса именно с выделенного IP-адреса существует несколько вариантов:

  1. Использовать функцию socket_bind:

    <?php
    // Создаем новый сокет:
    $sock socket_create(AF_INETSOCK_STREAMSOL_TCP);
    // Ваш выделенный IP-адрес:
    $sourceip 'xxx.xxx.xxx.xxx';
    // Используем этот IP-адрес:
    socket_bind($sock$sourceip);
    // Соединяемся с удаленным сервером:
    socket_connect($sock'xmlsearch.yandex.ru'80);
    // Делаем запрос:
    $request 'GET /xmlsearch?query=' $search ' HTTP/1.0' ."\r\n" .'Host: xmlsearch.yandex.ru ' "\r\n\r\n";
    socket_write($sock$request);
    // Получаем и выводим ответ:
    while(!socket_last_error($sock)){
        if($buffer=socket_read($sock,512,PHP_NORMAL_READ)){
            echo $buffer;
            } }
    // Закрываем сокет:
    socket_close($sock);
    ?>

    Здесь переменная $search обозначает только сам поисковый запрос, как это описано на сайте Яндекса, то, что написано после выражения «query=». При использовании PHP-интерпретатора как модуля Apache (по умолчанию на виртуальном хостинге именно так) работа с сокетами запрещена, поэтому следует использовать свой PHP-интерпретатор, собрать который можно по инструкции при конфигурировании обязательно указав ключ –enable-sockets.

  2. C помощью curl_setopt:

    <?php
    $ch curl_init();
       curl_setopt($chCURLOPT_CONNECTTIMEOUT30);
       curl_setopt($chCURLOPT_TIMEOUT30);
       curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
       curl_setopt($chCURLOPT_NOBODYfalse);
       curl_setopt($chCURLOPT_HEADERfalse);
       curl_setopt($chCURLOPT_INTERFACE"xxx.xxx.xxx.xxx");
       curl_setopt($chCURLOPT_URL$search);
       $xml_data=curl_exec($ch);
    curl_close($ch);
    ?>

Переменная $search — HTTP-запрос целиком (то есть URL).

В этом случае также потребуется собрать свой интерпретатор PHP, указав при конфигурировании ключ –with-curl=/usr/local.

Возможности изменения конфигурации PHP для пользователя

Очень часто пользователю требуется так или иначе изменить настройки 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-файл:

/usr/local/etc/php.ini
или
/usr/local/etc/php.ini
в зависимости от вида используемого SAPI-интерфейса (cgi или cli).

Во втором случае, когда не требуется использование каких-либо дополнительных модулей, а необходимо лишь изменить значение управляемых в php.ini директив — следует просто скопировать уже собранный исполняемый файл php-SAPI на площадку и произвести необходимые действия с .htaccess:

/usr/local/bin/php-cgi
или
/usr/local/bin/php
в зависмости от вида используемого SAPI-интерфейса.

В случае, если установленные значения директив в наших INI-файлах совпадают с желаемыми — копировать INI-файл не нужно. В частности, такие действия проводятся, когда требуется увеличить значение memory_limit для PHP. Если предполагается изменение директив в php-SAPI.ini — его следует скопировать, подобно описанному выше способу.

ls /usr/local/etc/php.ini | awk '{print $1}' | xargs grep memory_limit
/usr/local/etc/php.ini: memory_limit = 32M

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

Как собрать свой собственный интерпретатор PHP

Для того, чтобы собрать свой собственный интерпретатор PHP сначала нужно получить доступ к unix shell. Далее, зайдя в UNIX shell, действуйте по следующему алгоритму:

  • В домашней директории создаем поддиректорию для временного хранения исходных текстов интерпретатора PHP. Создаем каталог с названием src командой mkdir src и заходим в него, выполнив команду cd src.
  • Скачиваем с сайта разработчиков дистрибутив PHP:

    wget http://museum.php.net/php5/php-5.2.11.tar.bz2

  • Распаковываем архив командой tar -xjvf php-5.2.11.tar.bz2
  • Переходим в каталог php-5.2.11 командой cd php-5.2.11
  • Используя команду ./configure выполняем предварительную конфигурацию PHP для дальнейшей компиляции. Выполнив команду ./configure --help | more вы увидите полный список возможных опций, из которых вам нужно выбрать нужные.

    Пример конфигурации:

    ./configure --prefix=/home/uXXXXX/php \
    --with-mysql=/usr/local --enable-ftp --enable-dbase \
    --with-gdbm --with-ndbm --with-iconv=/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 --disable-posix \
    --enable-force-cgi-redirect --enable-inline-optimization \
    --without-pear --disable-debug

    Пример конфигурации с поддержкой IMAP:

    ./configure --prefix=/home/uXXXXX/php \
    --with-mysql=/usr/local --enable-ftp --enable-dbase \
    --with-gdbm --with-ndbm --with-iconv=/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 --disable-posix \
    --enable-force-cgi-redirect --enable-inline-optimization \
    --without-pear --disable-debug --with-imap --with-imap-ssl

  • Запускаем компиляцию и последующую установку уже сконфигурированного PHP:

    make
    make install

    По завершению процессов сборки и установки в каталоге php/bin/ (выполняем cd ~/php/bin/) вы найдете исполняемый бинарный файл php.

  • Посмотреть с какими модулями он был собран можно командой ./php -m (чтобы убедиться что вы собрали именно нужный вам PHP)

  • Копируем исполняемый файл в ваш каталог cgi-bin, выставляем необходимые права:

    cp /home/uXXXXX/php/bin/php-cgi /home/uXXXXX/имя_домена/cgi-bin/php
    
    chmod 755 /home/uXXXXX/имя_домена/cgi-bin/php 

    Если вы собираете PHP версии более ранней, чем 5.2.3, то CGI-интерпретатор создается с другим именем:

    cp /home/uXXXXX/php/bin/php /home/uXXXXX/имя_домена/cgi-bin/
    
    chmod 755 /home/uXXXXX/имя_домена/cgi-bin/php

    Копируем конфигурационный файл в ваш каталог cgi-bin:

    cp /usr/local/etc/php.ini /home/uXXXXX/имя_домена/cgi-bin/php.ini

  • uXXXXX в этой команде нужно заменить на название вашей виртуальной площадки, а имя_домена — на название вашего домена, для которого мы устанавливаем новый PHP.

  • В каталоге www создаем файл .htaccess со следующими директивами:

    Action php-script /cgi-bin/php
    AddHandler php-script .php

    Теперь файлы с расширением *.php будут обрабатываться именно собранным вами PHP, а остальные PHP-скрипты (файлы с другими расширениями из тех, что обрабатываются нашим веб-сервером как PHP-скрипты) — основным PHP-модулем веб-сервера.

Если все работает, то каталог $HOME/php-5.2.11 можно удалить:

cd; rm -rf php-5.2.11

Установка расширения ionCube

  • Предварительно надо скопировать нашу cgi-версию PHP или же собрать собственную
    $ cd ~/domain.tld/cgi-bin/
    $ cp /usr/local/bin/php-cgi php

    И создать файл php.ini:

    $ cp /usr/local/etc/php.ini php-cgi.ini
    $ ln -s php-cgi.ini php.ini
    

    Теперь в каталоге domain.tld/www нужно создать файл .htaccess (или изменить существующий) со следующими директивами:

    Action php-script /cgi-bin/php
    AddHandler php-script .php
  • Скачиваем дистрибутив ionCube с сайта разработчика:
    $ cd ~
    $ wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_fre_8_x86-64.tar.gz
  • Распаковываем:
    $ tar xzf ioncube_loaders_fre_8_x86-64.tar.gz
  • Добавляем данное расширение в php.ini:
    $ echo "zend_extension = /home/uXXXXX/ioncube/ioncube_loader_fre_5.3.so" >> ~/domain.tld/cgi-bin/php.ini
  • Для проверки корректности установки выполните следующие команду:

    $ cp ~/ioncube/loader-wizard.php ~/domain.tld/www/

    И откройте ссылку http://domain.tld/loader-wizard.php в браузере

    В случае, если все установлено корректно, по ссылке Вы увидите страницу со следующим текстом:

    "The ionCube Loader 3.3.16 is already installed and encoded
    files should run without problems."

Как выполнять PHP-скрипты в заданное время по расписанию

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

Подробности о работе cron и его использовании вы найдете в отдельном документе. Здесь же мы опишем тонкости запуска таким образом именно PHP-скриптов.

На наших серверах установлен бинарный файл интерпретатора PHP, который можно вызывать из cron. Полный путь к нему — /usr/local/bin/php. В качестве параметра нужно передать полный путь до запускаемого PHP-скрипта. Пример задания для cron:

  • в случае с PHP 5 
    0 1 * * * /usr/local/bin/php /home/uXXXXX/script.php
  • или в случае с PHP 4
    0 1 * * * /usr/local/bin/php /home/uXXXXX/script.php

В данном примере скрипт, который находится на диске сервера и имеет полный путь /home/uXXXXX/script.php, запускается в 1 час ночи каждый день. Не забывайте нажимать Enter после каждой строки в cron — все строки в сценариях cron должны заканчиваться переводом строки или задание работать не будет.

Вывод ошибок в PHP

Иногда возникает необходимость получить информацию о том, какие ошибки возникают при выполнении PHP-скриптов. При использовании PHP как модуля Apache (по умолчанию именно так) вывод ошибок доступен в личном кабинете в меню Древо услуг в разделе Домен domain.tld, где domain.tld — имя вашего домена, далее характеристика HTTP > error_log.

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

  1. Если вы используйте PHP-интерпретатор как модуль Apache, создайте в той директории, где находятся скрипты, файл .htaccess (если он не существует) и добавьте 2 строки, одна из которых включает вывод ошибок в браузер, а вторая определяет уровень отображаемых ошибок:

    php_flag display_errors on
    php_value error_reporting 2047

    Число 2047 является значением константы E_ALL и включает вывод всех типов ошибок. Значение константы E_ALL зависит от версии PHP. Точное значение можно узнать на сайте разработчика.

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

    display_errors = Off
    на 
    display_errors = On

    Кроме этого, надо изменить значение параметра error_reporting со значения E_ALL & E_NOTICE на простое E_ALL (по желанию).

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

Ограничения

Нужно учитывать, что на работу 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: