Progress28.ru

IT Новости


09ae9cb0
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php change dir

How To Change The Default PHP Install Directory?

JBLDW 4 Light Poster

What do I need to change in order to change the default usr > local > lib > php install directory? Both the builds are to be compiled from source (something I am quite familiar with), and will not be from pre-configured packages.

I need to do this in order to allow me to build and run two seperate modules without any conflicts. — That part is not a problem, but trying to work out what to change in order to allow for the installs I need is.

    2 Contributors
  • forum9 Replies 999 Views 1 Week Discussion Span
  • commentLatest Post 9 Years Ago by JBLDW

JBLDW 4

I have just found a possible solution to this problem — no idea whether it will actually work with our setup yet, or whether it will work with both PHP5 and PHP6 but.

. is the link for anyone else with a similar problem.

nonshatter 26

Firstly, what Linux distro are you using? And in what format is the source in? rpm/deb/tar?

JBLDW 4

Thanks for the reply, nonshatter. I am glad that you replied because there is still one major problem that I overlooked in my first reply: namely that configuration change details will still leave me with the initial problem of getting PHP to install in different directories in the first place. — Anyway, to answer your question:

Linux: Debian Lenny (latest stable release), running as an unmodified image on a KVM VPS server.

Apache: apache2-mpm-prefork.deb apache2-prefork-dev.deb

PHP: intend to install 5.2.13 and 6.3.3 (one for a webstore that won’t work with PHP 6 and the other for a personal project that may become a business project at a later date). — Both of these will be compiled from source.

JBLDW 4

I think that this is where the changes need to be made:

As you can see, it is a block of switches from the ./configure options. If I am not mistaken the changed switches (a number of them have had /php53 added to them) should mean that these switches will create a PHP installation that will run from usr > local > lib > php53

The add the above changes it would be necessary to add the following to ./configure:

which would be entered as:

nonshatter 26

Yes you’re correct. I remember doing this on an old legacy system (SLES 9.3).

Where prefix is the target installation directory, and the apxs2 switch is mandatory. But be wary, if you forget to add a specific module (e.g. php5-mysql, mod_ldap etc) at some point, then you’ll have to go round the loop again (re-configure and re-make), adding the new switch options. I remember it being a bit of a pain to get all aspects of functionality to work!

Perhaps save your final configure command in a text file so you can refer back to it if you need to.

Hope that helps,
ns

JBLDW 4

JBLDW 4

Thanks, nonshatter. — Yes, I normally do use a text file to start with.

. and take it from there.

. and, yes, I see what you mean about the modules (thank-you). — Trying to identify and find all the dev libraries is an absolute pain too.

JBLDW 4

This method works for creating two (or more if need be) install directories, but fails when used to create seperate libraries for Apache. — The internal name of the generated .so files is the same even if the file name is changed and there is no way to alter this.

Apache documentation contains a totally useless article on how to use the APXS module to change such details ( ‘ data-template=’

JBLDW 4

This setup works, but ultimately fails because of segmentation faults when trying to start Apache (same items in each module being loaded into the same memory spaces I would guess):

libphp$(PHP_MAJOR_VERSION) -> change to libphp521

libphp$(PHP_MAJOR_VERSION) -> change to libphp521

mod_php5 -> change in makefile and change file name of php_5.c in the /sapi/apache2handler directory, also references in config.m4 config.w32, php.sym, php5apache2.dsp

php5_module -> change references in php_5.c, php_apache.h, and sapi_apache2.c

./configure —bindir=/usr/local/bin/521 —sbindir=/usr/local/sbin/521 —datadir=/usr/local/share/521 —sysconfdir=/usr/local/etc/521 —localstatedir=/var/local/521 —libdir=/usr/local/lib/521 —includedir=/usr/local/include/521 —with-apxs2=/usr/bin/apxs2 —enable-debug —with-config-file-path=/usr/local/521 —disable-short-tags —enable-dmalloc —with-openssl —with-pcre-regex —with-zlib —enable-bcmath —with-bz2 —enable-calendar —with-curl —enable-exif —enable-ftp —with-gd —with-jpeg-dir —with-png-dir —with-xpm-dir —with-freetype-dir —enable-gd-native-ttf —enable-gd-jis-conv —with-gettext —with-mhash —enable-mbstring —with-libmbfl —with-mcrypt —with-mysql=/usr/bin —with-mysql-sock —with-mysqli=/usr/bin/mysql_config —enable-embedded-mysqli=/usr/bin/mysql_config —with-pdo-dblib —with-pdo-mysql —with-mm —enable-shmop —with-libxml-dir=/usr/lib —enable-soap —enable-sockets —enable-sqlite-utf8 —enable-sysvmsg —enable-sysvsem —enable-sysvshm —with-t >

. so it would seem that trying to run multiple versions of PHP on the same machine for use with Apache is possible, but it would be necessary to write some code to avoid memory space collisions. — I would test using different config options in each module but it seems that Apache is absolutely determined that multiple versions are not going to run and that is that, so the chances are good that, in doing so, I would be completely wasting my time.

Php change dir

Произведен поиск по ключевому слову dir . Результаты поиска приведены ниже:

Читать еще:  Configuration php настройка
Найденная функцияОписание функции
cpdf_set_font_ dir ectories()Устанавливает директории поиска при установке внешних шрифтов
close dir ()Освободить дескриптор каталога
ch dir ()Сменить каталог
dbplus_ch dir ()Получает/устанавливает виртуальную текущую директорию БД
dir ectoryiterator_construct()Constructs a new dir iterator from a path
dir ectoryiterator_current()Return this (needed for Iterator interface)
dir ectoryiterator_getatime()Get last access time of file
dir ectoryiterator_getchildren()Returns an iterator for the current entry if it is a directory
dir ectoryiterator_getctime()Get inode modification time of file
dir ectoryiterator_getfilename()Return filename of current dir entry
dir ectoryiterator_getgroup()Get file group
dir ectoryiterator_getinode()Get file inode
dir ectoryiterator_getmtime()Get last modification time of file
dir ectoryiterator_getowner()Get file owner
dir ectoryiterator_getpath()Return directory path
dir ectoryiterator_getpathname()Return path and filename of current dir entry
dir ectoryiterator_getperms()Get file permissions
dir ectoryiterator_getsize()Get file size
dir ectoryiterator_gettype()Get file type
dir ectoryiterator_is dir ()Returns true if file is directory
dir ectoryiterator_isdot()Returns true if current entry is » or »
dir ectoryiterator_isexecutable()Returns true if file is executable
dir ectoryiterator_isfile()Returns true if file is a regular file
dir ectoryiterator_islink()Returns true if file is symbolic link
dir ectoryiterator_isreadable()Returns true if file can be read
dir ectoryiterator_iswritable()Returns true if file can be written
dir ectoryiterator_key()Return current dir entry
dir ectoryiterator_next()Move to next entry
dir ectoryiterator_rewind()Rewind dir back to the start
dir ectoryiterator_valid()Check whether dir contains more entries
dir name()Возвращает имя каталога из указанного пути
fam_monitor_ dir ectory()Monitor a directory for changes
ftp_ch dir ()Изменяет текущую директорию на FTP сервере
ftp_mk dir ()Создаёт директорию
ftp_rm dir ()Удаляет директорию
gopher_parse dir ()Translate a gopher formatted directory entry into an associative array
iis_get_ dir _security()Gets Directory Security
iis_set_ dir _security()Sets Directory Security
maxdb_fetch_field_ dir ect()Fetch meta-data for a single field
mysqli_fetch_field_ dir ect()Fetch meta-data for a single field
pspell_config_data_ dir ()Location of language data files
pspell_config_dict_ dir ()Location of the main word list
read dir ()Получить элемент каталога по его дескриптору
recursive dir ectoryiterator_getchildren()Returns an iterator for the current entry if it is a directory
recursive dir ectoryiterator_haschildren()Returns whether current entry is a directory and not » or »
recursive dir ectoryiterator_key()Return path and filename of current dir entry
recursive dir ectoryiterator_next()Move to next entry
recursive dir ectoryiterator_rewind()Rewind dir back to the start
rewind dir ()Сбросить дескриптор каталога
scan dir ()Получить список файлов и каталогов, расположенных по указанному пути
ssh2_sftp_mk dir ()Create a directory
ssh2_sftp_rm dir ()Remove a directory
open dir ()Открыть каталог
is_ dir ()Определает, является ли файл директорией
mk dir ()Создаёт директорию
rm dir ()Удаляет директорию

Итого найдено: 56 функций, содержащих ключевое слово dir .

PHP: список файлов и директорий

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

Для предметного обсуждения решения и демонстраций предположим, что структура директорий имеет следующий вид:

Базовые решения

Первый набор решений основан на использовании функции glob() , комбинации функций opendir() , readdir() и closedir() , и также функции scandir() .

Использование glob()

Первое решение базируется на использовании функции glob(), которая позволяет выполнять поиск пути с помощью шаблонов. Функция имеет два параметра:

  • $pattern (обязательный): шаблон поиска
  • $flags (опциональный): один или несколько флагов, описание которых можно найти в документации

Рассмотрим примеры. Для поиска в директории всех файлов и директорий, имена которых заканчиваются на .txt, следует использовать код:

Если вывести переменную $filelist , то получим:

Если нужен список файлов и директорий, имена которых начинаются на “te”, то код будет выглядеть так:

А вывод имеет вид:

А для получения списка только директорий с именами, содержащих “ma”, используем код:

Последний пример выведет:

Обратите внимание, что в последнем примере использован флаг GLOB_ONLYDIR в качестве второго параметра функции. Поэтому файл master.dat исключен из списка. Хотя функция glob() очень проста в использовании, иногда она недостаточно гибкая. Например, нет флага для получения только файлов (без директорий), которые соответствуют шаблону.

Используем opendir() , readdir() , и closedir() .

Второй подход к получению списка файлов и директорий, который мы обсудим, заключается в использовании функций opendir() , readdir() , и closedir() .

Функция opendir() открывает директорию и возвращает дескриптор соединения. Как только дескриптор получен, можно использовать функцию readdir() . С каждым обращением данная функция выдает имя следующего файла или директории внутри открытого каталога. Если все имена уже были перечислены, функция возвращает false. Для закрытия дескриптора используется функция closedir() .

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

Ниже приведенный пример возвращает список имен файлов и директорий начинающихся на “te”:

При выполнении выше приведенного кода, переменная $entry будет содержать такие включения, как “.” и “..”. Это две виртуальные директории, которые имеются в каждом каталоге файловой системы. Они представляют текущий каталог и родительский каталог соответственно.

Читать еще:  Php warning division by zero in

Второй пример выводит только файлы, содержащиеся в заданном каталоге.

Пример выдаст следующее:

Использование scandir()

В завершение представим функцию scandir() . Она имеет только один обязательный параметр: путь для чтения. Функция возвращает массив файлов и директорий, расположенных по указанному пути. Для получения списка файлов и директорий по определенному критерию нужно выполнить дополнительную фильтрацию. С другой стороны, решение получается более кратким и не требует управления дескрипторами.

Данный пример показывает, как получить список файлов и каталогов, имена которых начинаются на “te”:

Воспользуемся итераторами SPL

Теперь рассмотрим использование итераторов SPL. Но прежде, чем приступить к решению нашей задачи, проведем введение в библиотеку SPL и итераторы. Библиотека SPL предоставляет серию классов для объектно ориентированных структур данных, итераторов, дескрипторов файлов и прочее.

Одно из преимуществ итераторов заключается в том, что они являются классами и их можно расширить для удовлетворения собственных нужд. Другой плюс состоит в том, что итераторы имеют собственные методы, которые являются полезными при решении множества типовых задач и располагаются в одном месте. Посмотрите на пример использования FilesystemIterator в сравнении с readdir() . Оба метода применяют цикл, но в случае readdir() вы обрабатываете только строку, а FilesystemIterator работает с объектом, который может содержать дополнительную информацию о файле или директории (размер, владелец, права доступа и так далее).

Конечно, PHP представляет возможность для получения такой информации с помощью функций,например filesize() и fileowner(). Но PHP5 основан на использовании концепции ООП. Поэтому лучше использовать современные методы работы с языком программирования. На нашем сайте есть уроки, посвященные работе с итераторами.

Как уже сообщалось во водной части урока, мы рассмотрим использование FilesystemIterator , RecursiveDirectoryIterator и GlobIterator . Первый наследуется от DirectoryIterator , а остальные от FilesystemIterator . Они все имеют один и тот же конструктор, который принимает два параметра:

  • $path (обязательный): путь к пункту файловой системы, над которым совершаются операции
  • $flags (опциональный): один или несколько флагов, перечисленных в документации

Реальное различие в данных итераторах заключается в их использовании для навигации по заданному пути.

FilesystemIterator

Использовать FilesystemIterator очень просто. Рассмотрим в действии. Представляем два примера. Первый показывает поиск всех файлов и каталогов, имена которых начинаются на “te”. Второй пример использует другой итератор RegexIterator для поиска всех файлов и каталогов, имена которых заканчиваются на “t.dat” или “t.php”. Итератор RegexIterator используется для фильтрации результата на основе регулярных выражений.

Выше приведенный код выдаст результат, аналогичный предыдущим примерам.

Второй пример с применением RegexIterator :

Он будет выводить:

RecursiveDirectoryIterator

Итератор RecursiveDirectoryIterator обеспечивает интерфейс для рекурсивного прохода по директориям файловой системы. Он имеет несколько полезных методов, таких как getChildren() и hasChildren() , которые возвращают итератор для текущего места, если это директория, и проверяют, является ли текущая точка входа директорией. Следующий пример демонстрирует использование RecursiveDirectoryIterator и getChildren() . Результат будет такой же, как и в предыдущих примерах.

GlobIterator

Итератор GlobIterator выполняет проход по файловой системе также, как и функция glob() . Первый параметр может включать шаблон для имени. Пример демонстрирует использование GlobIterator с тем же результатом, что и ранее.

Заключение

В данном уроке демонстрируется использование различных подходов для достижение одинаковой цели: получение списка файлов и директорий. Следует запомнить следующие ключевые моменты:

  • Функция glob() является встроенным решением, но она недостаточно гибкая.
  • Решение на основе opendir() , readdir() , и closedir() более сложное и требует дополнительной фильтрации, но оно более гибкое.
  • Функция scandir() требует дополнительной фильтрации, но работает без обработки дескриптора.
  • Если вы используете подход ООП, то следует применять библиотеку SPL. Дополнительно вы можете расширить классы своим функционалом.
  • Итератор GlobIterator имеет функцию предварительной фильтрации, а другие используют RegexIterator .

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: phpmaster.com/list-files-and-directories-with-php/
Перевел: Сергей Фастунов
Урок создан: 13 Ноября 2012
Просмотров: 99668
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Как подняться к корню каталога с помощью php

Войны между программистами php и perl кажется давно уже позади. Даже я стал программировать на php, напрочь забыв perl. Но это не значит, что меня всё устраивает в php. Например то, что скрипты на php могут не только легко содержать куски html-разметки, но и запускаться из любой папки на сервере, я до сих пор считаю серьёзной уязвимостью, накладывающей дополнительные обязательства на программиста, пишущего код. Наверняка, можно озадачится и серверными средствами ограничить запуск php-скриптов из всех директорий, кроме выбранной, (или, по крайней мере, прописать в правах доступа к папкам запрет на исполнение с наследованием этого свойства файлами), но я пока не встречал кода, который показал бы, что этим кто-то озадачивался. Как использовать эту особенность php, я для себя решил. А в этой статье рассмотрим, как подняться по всему дереву каталогов в корневую директорию с помощью php-скрипта , который, как увидим, может спокойно лазить по всему серверу и что-то там себе в делать тихим сапом (в зависимости от развитости и извращённости фантазии программиста, его написавшего).

Читать еще:  Asp phpsessid buy

Основные переменные и функции php для определения папки, в которой находится программа

Для начала рассмотрим две глобальные переменные php и одну функцию, которые позволяют быстро с помощью языка программирования определить место, где находится скрипт в дереве каталогов на сервере. Эксперимента ради, я загрузил скрипт глубоко в папки установленной Joomla, на которой работает этот сайт.

Итак, скрипт с названием delete.php (потому что после написания статьи будет удалён) лежит в папке wwwmb4.rutemplatesprotostarhtmllayoutsjoomlahtmlbatch , если рассматривать его путь от домашней директории пользователя.

В php версиях: PHP 4 >= 4.1.0, PHP 5, PHP 7 есть переменная $_SERVER , содержащая в себе массив с заголовками, путями и местоположениями скриптов. Записи в этом массиве создаются веб-сервером. Нет гарантии, что каждый веб-сервер предоставит любую информацию, но по умолчанию, рассматриваемые ниже два пути, хранящиеся в этом массиве, отдаются сервером «на ура».

  • $_SERVER[‘DOCUMENT_ROOT’]
    • в этой переменной содержится директория корня документов, в которой выполняется текущий скрипт, в точности та, которая указана в конфигурационном файле сервера.
  • $_SERVER[‘SCRIPT_FILENAME’]
    • в этой переменной содержится абсолютный путь к исполняемому скрипту.

Для проверки, как это работает, достаточно запустить php-скрипт, который выдаст на экран содержимое этих переменных:

В результате получим нечто подобное:

То есть корневую папку пользователя, под которым запущен на выполнение скрипт и ВНИМАНИЕ (!) — полный путь к исполняемому скрипту от корня дерева каталогов сервера (!). Красота 😉

В php есть ещё одна полезная функция, которой мы воспользуемся ниже для подъёма к корню файловой системы сервера, которая получает имя текущего рабочего каталога. Это функция getcwd() , работающая во всех версиях php (PHP 4, PHP 5, PHP 7).

То есть, запустив код:

Получим в качестве выполнения:

Всё тот же путь, по которому можно подняться до корня файловой системы.

Как получить список папок ветки дерева каталога, в котором лежит php-скрипт

Самый простой способ получить список папок ветки дерева каталога, в котором лежит php-скрипт, это воспользоваться стандартной функций php preg_split() , работающей во всех версиях этого языка (PHP 4, PHP 5, PHP 7). Эта функция разбивает строку по регулярному выражению и помещает результаты разбиения в массив. В нашем случае, в качестве разделителей папок однозначно используется / , так что и думать особо не нужно, используя для вывода функцию print_r() так, подробно описано в → этой статье:

В итоге получим вывод этого массива, в котором будут содержаться все папки, встречающиеся по пути от файла до корня файловой системы:

Если в этот массив нужно включить и имя файла, то вместо getcwd() нужно использовать глобальную переменную $_SERVER[‘SCRIPT_FILENAME’] .

Как подняться к корню каталога с помощью php, заходя в каждую папку

Вот тут мы и добрались до ответа на основой вопрос: «Как подняться к корню каталога с помощью php?» Для этого достаточно знать, что в операционных системах типа *nix ссылкой на предыдущую папку служит .. , а в php есть функция, позволяющая менять каталог chdir() . То есть, для перехода на каталог выше, нужно указать скрипту: chdir ( ‘..’ ) . В итоге получим такой скрипт, который поднимается к корню каталога файловой системы, последовательно заходя во все встречные родительские папки:

Для того, чтобы программа не пыталась выйти за пределы операционной системы в открытый космос (всё равно не получится), в цикле while нужно указать ограничение, что дальше корня / даже не пытаться заходить: getcwd() != ‘/’ . Иначе будет бесконечный цикл и программа будет тупо биться в конечную папку, пытаясь выйти за её пределы.

В результате наш скрипт бодро откроет все папки (и даже сможет по ним полазить, если нужно) и выдаст список того, в каких директориях он побывал:

/var/www/mb4/data/www/mb4.ru/templates/protostar/html/layouts/joomla/html/batch
/var/www/mb4/data/www/mb4.ru/templates/protostar/html/layouts/joomla/html
/var/www/mb4/data/www/mb4.ru/templates/protostar/html/layouts/joomla
/var/www/mb4/data/www/mb4.ru/templates/protostar/html/layouts
/var/www/mb4/data/www/mb4.ru/templates/protostar/html
/var/www/mb4/data/www/mb4.ru/templates/protostar
/var/www/mb4/data/www/mb4.ru/templates
/var/www/mb4/data/www/mb4.ru
/var/www/mb4/data/www
/var/www/mb4/data
/var/www/mb4
/var/www
/var

Резюме

Таким образом, разместив короткую программу на php в любое место на сервере, можно попасть в любую родительскую директорию. Что с этим делать и как можно использовать, как-нибудь в другой раз.

Напоследок полный работающий код для тестирования и дописывания этого php-скрипта. Скрипт безобидный: ничего не дописывает и не меняет на сервере, так что его можно использовать в качестве заготовки для написания более осмысленной программы, выполняющей определённые действия. 😉

‘; while ( getcwd() != ‘/’ ) < echo getcwd() . "
«; chdir ( ‘..’ ); > echo «
$_SERVER[‘DOCUMENT_ROOT’] = » . $_SERVER[‘DOCUMENT_ROOT’] . «
«; echo «$_SERVER[‘SCRIPT_FILENAME’] = » . $_SERVER[‘SCRIPT_FILENAME’] . ««; ?>

Ссылка на основную публикацию