Помощь

Все разделы помощи → Вопросы по виртуальному хостингу

PHP-скрипт не закачивает файлы на сервер! Что делать?

Скрипт запускается с правами nobody, соответственно у директории, в которую он пытается положить закачиваемый файл, должны быть права на доступ 777.

Как установить PHP5 в режиме CGI?
Для установки php в режиме cgi, необходимо выполнить следующие действия:
  1. Создать текстовый файл с названием php (без расширения и без пробелов в имени) следующего содержания:

    #!/usr/bin/php-cgi -cphp-cgi.ini
  2. Закачать созданный файл php в cgi-bin директорию своего сайта
  3. Установить права на файл php 755 (-rwxr-xr-x)
  4. В файле httpdocs/.htaccess своего домена прописать:

    Action phpcgi-script /cgi-bin/php
    AddHandler phpcgi-script .php
  5. Если вы хотите иметь собственные настройки php, скачайте файл настроек:

    http://soft.mchost.ru/php-cgi.ini

    Загрузите файл php-cgi.ini в папку cgi-bin вашего домена, где уже лежит файл php

Какая версия php установлена на вашем хостинге?

На хостинге установлен PHP версии 5.

Какие права доступа должны быть у PHP скриптов?

Атрибуты к php, так же как и к html, должны быть 644 (rw-r--r--). Запись-чтение для владельца и только чтение для всех остальных.

Не могу удалить каталог. Permission denied.

Скорее всего, каталог или файл был создан PHP-скриптом и имеет owner'а nobody, соответственно не подлежит удалению от вашего имени. Удалить такой каталог со всем содержимым можно скриптом примерно такого вида:

<?
$deldir = "ПУТЬ_К_ДИРЕКТОРИИ";
rmdirr($deldir);

function rmdirr($dirname)
{
if (!file_exists($dirname)) {
return false;
}
if (is_file($dirname)) {
return unlink($dirname);
}
$dir = dir($dirname);
while (false !== $entry = $dir->read()) {
if ($entry == '.' || $entry == '..') {
continue;
}
rmdirr("$dirname/$entry");
}
$dir->close();
return rmdir($dirname);
}
?>

Скрипт следует вызывать через браузер. В переменной $deldir в начале скрипта следует указать путь к удаляемой директории относительно того места, откуда вызывается скрипт. Будут удалены все файлы и подкаталоги, принадлежащие nobody.

Поддерживается ли на хостинге pear?

Да, вы можете взять нужные скрипты с http://pear.php.net и установить их в папке httpdocs.

При создании файлов средствами PHP файлы создаются с пользователем apache и с правами 644, поэтому я не могу ими управлять, как быть?

Дело в том, что PHP-сценарии, запущенные модулем mod_php, выполняются от имени пользователя apache. Соответственно, если на чтение/модификацию не были выставлены разрешения для всех (достаточно 666 - для файлов, 777 - для каталогов), то модификация созданных такими скриптами файлов (каталогов) пользователю будет запрещена (при доступе по SSH, по FTP).

Для того, чтобы проблема не возникала - нужно для такого каталога (файла) установить права, достаточные для модификации файлов, посредством функции chmod.

Сделать это рекурсивно можно, исполнив PHP-сценарий:

<?php
function chmod_R($path, $perm) {

$handle = opendir($path);
while ( false !== ($file = readdir($handle)) ) {
if ( ($file !== ".") && ($file !== "..") ) {
if ( is_file($file) ) {
chmod($path . "/" . $file, $perm);
}
else {
chmod($path . "/" . $file, $perm);
chmod_R($path . "/" . $file, $perm);
}
}
}
closedir($handle);
}

$path = $_SERVER["QUERY_STRING"];

if ( $path{0} != "/" ) {
$path = $_SERVER["DOCUMENT_ROOT"] . "/" . $path;
}

chmod_R($path, 0777);
chmod($path, 0777);
echo $path;
?>

Разместите этот файл на хостинге, в директории, доступной веб-серверу, например, как httpdocs/chmod.php

Вызывать скрипт нужно так:

http://ваш_домен/chmod.php?path_to_problem_dir

path_to_problem_dir - путь, относительно DocumentRoot для данного домена (httpdocs/ в нашем примере).

Установлен ли у Вас модуль РНР сURL?

Да, у нас установлен модуль PHP cURL на всех серверах виртуального хостинга.

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

Иногда возникает необходимость получить информацию о том, какие ошибки возникают при выполнении PHP-скриптов. При использовании PHP как модуля Apache (по умолчанию именно так) вывод ошибок доступен в панели управления в разделе "Управление услугами", далее в таблице домена иконка "Лог ошибок".

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

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

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

    display_errors = Off

    на

    display_errors = On

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

Рекомендуем включать вывод всех ошибок, указывая для директивы error_reporting значение E_ALL(2047).

Использование собственного PHP

Существует возможность использовать PHP собственной версии на домене. Для этого понадобится тариф с поддержкой SSH-доступа.

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

  1. Подключиться по SSH на сервер в домашнюю директорию, а затем перейти в директорию private/:

    $ cd ~/private
  2. Скачаем архив с нужной версией PHP. В данном примере это последняя версия ветки 5.2.х - 5.2.14 (другие версии можно найти на официальном сайте):

    $ wget http://ru.php.net/get/php-5.2.14.tar.bz2/from/ru2.php.net/mirror
  3. Разархивируем архив:

    $ tar -xjvf php-5.2.14.tar.bz2
  4. Переходим в директорию только что разархивированного архива:

    $ cd php-5.2.14
  5. Открываем файл install-sh (он пустой и не нужен для компиляции):

    $ nano -w install-sh

  6. Вписываем в него параметры компиляции PHP (вместо domain.tld нужно вписать имя Вашего домена) таким образом:

    #!/bin/sh

    ./configure --prefix=/home/httpd/vhosts/domain.tld/private/php-5.2.14 --enable-force-cgi-redirect --disable-debug --enable-inline-optimization --with-bz2 --with-db4=/usr --with-curl --with-freetype-dir=/usr --with-png-dir=/usr --with-gd --enable-gd-native-ttf --without-gdbm --with-gettext --with-iconv --with-jpeg-dir=/usr --with-openssl --with-pspell --enable-xml --with-libexpat-dir=/usr --with-zlib --enable-bcmath --enable-exif --enable-ftp --enable-magic-quotes --enable-sockets --enable-calendar --enable-mbstring --enable-mbregex --enable-zip --with-xsl --with-mysqli --with-mysql --with-pdo-mysql=shared --with-libdir=lib64
  7. Сохраняем файл, нажав Control+X, Y и Enter.
  8. Делаем файл исполняемым:

    $ chmod +x install-sh
  9. Запускаем этот скрипт:

    $ ./install-sh
  10. После выполнения скрипта компилируем:

    $ make
  11. Устанавливаем:

    $ make install
  12. Переходим в директорию cgi-bin/:

    $ cd ~/cgi-bin
  13. Создаем текстовый файл php5 (без расширения) с помощью такой команды (вместо domain.tld нужно вписать имя Вашего домена):

    $ echo '#!/home/httpd/vhosts/domain.tld/private/php-5.2.14/bin/php-cgi -c php-cgi.ini' > php5
  14. Делаем его исполняемым:

    $ chmod +x php5
  15. В директории архива PHP лежат примеры файлов настроек. Скопируем один из них, переименовав сразу в php-cgi.ini:

    $ cp ../private/php-5.2.14/php.ini-dist php-cgi.ini

    Таким образом, в директории cgi-bin/ у нас должны находиться два файла - php5 и php-cgi.ini.

  16. Переходим в директорию httpdocs/:

    $ cd ~/httpdocs
  17. Создаем файл .htaccess:

    $ nano -w .htaccess
  18. Вписываем в него следующее:

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

    Примечание: Если файл .htaccess уже присутствует (например, он был загружен со скриптом сайта), то надо дописать эти строки в него вместо создания файла.

  19. Сохраняем файл, нажав Control+X, Y и Enter
  20. Создаём файл phpinfo.php, чтобы проверить, что получилось:

    nano -w ~/httpdocs/phpinfo.php
  21. Вписываем в него следующее:

    <? phpinfo(); ?>
  22. Сохраняем файл, нажав Control+X, Y и Enter. Затем открываем его в браузере: http://domain.tld/phpinfo.php