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 . Результаты поиска приведены ниже:
Найденная функция | Описание функции |
---|---|
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 будет содержать такие включения, как “.” и “..”. Это две виртуальные директории, которые имеются в каждом каталоге файловой системы. Они представляют текущий каталог и родительский каталог соответственно.
Второй пример выводит только файлы, содержащиеся в заданном каталоге.
Пример выдаст следующее:
Использование 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-скрипта , который, как увидим, может спокойно лазить по всему серверу и что-то там себе в делать тихим сапом (в зависимости от развитости и извращённости фантазии программиста, его написавшего).
Основные переменные и функции 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’] . ««; ?>