- RU.PHP ------------------------------------------------------------- RU.PHP -
Msg : #5033 [1078]
От : FAQ AutoPoster 2:5012/8.13 06 декабря 03, 10:30
Кому : All 10 декабря 03, 21:42
Тема : FAQ [3/5]
-------------------------------------------------------------------------------
>>2.2. Скрещивание PHP/Win32 и Apache/Win32.
Предполагается, что вы уже установили PHP и Apache. Для внесения пущей
ясности положим, что PHP установлен в каталоге 'C:\HTTP\php', а Apache
в 'C:\HTTP\apache', причем Apache уже настроен и без лишней ругани отзывается
на имя localhost, а необходимые изменения внесены в php.ini.
Теперь определимся, каким образом PHP будет функционировать: в виде
CGI-приложения [1] или как SAPI-модуль Apache [2] (разбор полетов на предмет
различий см.)
1. Hастройка PHP в качестве CGI-приложения.
Откройте Notepad'ом (FAR'ом, NC, WinCmd, и т.п.) файл
C:\HTTP\apache\conf\httpd.conf и найдите в нем и раскомментируйте (уберите
значок # в начале строки) следующие строчки:
#AddType application/x-httpd-php .php
#AddType application/x-httpd-php-source .phps
затем вставьте после них это:
ScriptAlias "/__php_dir__/" "C:/HTTP/php/"
Action application/x-httpd-php "/__php_dir__/php.exe"
2. Hастройка PHP в качестве модуля Apache.
Добавьте в файл C:\HTTP\apache\conf\httpd.conf строчки:
LoadModule php4_module c:/HTTP/php/sapi/php4apache.dll
AddType application/x-httpd-php .php
Тестирование.
Теперь перезапустите Apache. Создайте в каталоге C:\HTTP\apache\htdocs файл
test.php следующего содержания:
запустите браузер и перейдите на http://localhost/test.php . Если ваш
браузер отобразил нечто табличное с большим количеством непонятной
информации, примите поздравления. Если вместо этого ваши старания
увенчались 'Error 500 - Internal Server Error', попробуйте прочитать эту
статью немного более внимательно.
> ivan kovalenko, 2:5057/53
2.3. Установка PHP >=4.2.2 как модуль Apache 2.0.x под Windows.
0. Прежде всего нужно скачать последние стабильные версии как Apache так и
PHP. PHP лучше скачать по адресу http://snaps.php.net/win32/, где выбрать
последний snapshot.
1. Итак, устанавливаем Apache 2.0.x как обычно.
2. Устанавливаем PHP в каталог c:\php (например).
3. Переименовываем файл php.ini-dist в php.ini и правим по вкусу,
4. обязательно не забыв указать путь к extensions, в нашем случае это
extension_dir = c:/php/extensions
5. и каталог с документами, в нашем случае это
doc_root = c:/Program files/Apache Group/Apache2/htdocs.
6. Копируем этот файл и файл php4ts.dll в каталог c:\winnt.
7. Меняем расширение у файла c:\php\sapi\php4apache2.dll на .so
8. В файле httpd.conf у Apache ищем строки, начинающиеся с LoadModule и
добавляем свою строку, не забыв кавычки,
LoadModule php4_module "c:/php/sapi/php4apache2.so"
9. Там же ищем строку AddType application/x-tar .tgz и ниже добавим свою
AddType application/x-httpd-php .php
10. необязательно: Ищем строки, начинающиеся с AddIcon и добавим .php в
AddIcon /icons/p.gif .pl .py .php
11. Стартуем (рестартуем) Apache
12. Если не запускается, читам Application log в Event Viewer-e и чешем
затылок, думая где ошиблись.
13. Возможно еще придется скопировать файлы из c:\php\dlls в
c:\winnt\system32, это если с какими-то extensions-ами не запустится.
В начале пробуйте закомментировав вообще все расширения.
> Andy Ice, 2:5012/8.13
-----------------------------------------------------------------------------
>>>3. Hастройка
-----------------------------------------------------------------------------
>>3.1 Каким образом создать ссылку, типа как у http://lenta.ru/2002/01/09/?
У ленты этот движок основан на mod_rewrite, имнсхо, поскольку там апач стоит
www.lenta.ru
HTTP/1.1 200 OK
Date: Fri, 11 Jan 2002 14:45:37 GMT
Server: Apache/1.3.14 (Unix) rus/PL30.0
соответственный rewrite rule регекспом - и все ок. а в директории хтмл'ки
складывать - черезчур корявый изврат. 8)
вот пример, как организовать подобное:
мы хотим выводить новости из базы данных по запрошенному ури
w3.lenta.ru/2002/01/11/tv6/ имея таблицу с полями новостей anchor
VARCHAR(255), date date, announce VARCHAR(255), body TEXT; где anchor -
текстовый указатель, date - дата, announce - анонс новости, body - тело
новости.
делаем виртуальный хост
--- [ httpd.conf ] ---
LoadModule rewrite_module modules/mod_rewrite.so
ServerName w3.lenta.ru
DocumentRoot "/wwwroot/htdocs/w3lenta"
RewriteEngine On
RewriteLogLevel 2
RewriteCond %{REQUEST_URI} !/index\.php
RewriteRule ^/([0-9][0-9][0-9][0-9]+)/([0-9][0-9]+)/([0-9][0-9]+)/(.*)/$
/news.php?anchor=$4&date=$1-$2-$3 [T=application/x-httpd-php,L]
ErrorLog logs/w3lenta-error.log
CustomLog logs/w3lenta-access.log common
Options +Includes -Indexes
--- [ httpd.conf ] ---
сразу привожу извинения за длинный регексп - пхп/перловый
^/(\d{4}+)/(\d{2}+)/(\d{2}+)/(.*)/$ не прокатил. видимо модифер \d rewrite
engine не понимает - у него там какие-то свои правила паттернов.
прописываем w3.lenta.ru в hosts на ip 192.168.10.1 (ip по вкусу - у кого
как отстроен локальный айпишник)
создаем два файла в корне /wwwroot/htdocs/w3lenta/:
1. этот будет отвечать на запрос w3.lenta.ru и в нем, допустим, строится
листинг по таблице из 10-ти последних новостей, но мы сюда забьем тестируемый
урл.
--- [ index.php ] ---
ТВ-6 распадается
--- [ index.php ] ---
2. этот будет выводить новость по date и anchor. кода не прописано, но
сделать select announce, body, date from table where date=$date AND
anchor=$anchor из таблицы новостей, я думаю, трудности никому не составит. 8)
--- [ news.php ] ---
echo 'данные запрошенной новости: anchor = '.$anchor.', date = '.$date.'
';
echo 'REQUEST_URI: http://'.getenv("HTTP_HOST").getenv("REQUEST_URI");
?>
--- [ news.php ] ---
набираем в ослике w3.lenta.ru, щелкаем линк, и наслаждаемся результатом 8)
данные запрошенной новости: anchor = tv6, date = 2002-01-11
REQUEST_URI: http://w3.lenta.ru/2002/01/11/tv6/
remarks: в реале можно сделать, если админ конфиг пропишет или ты сам
админ. 8)
некоторые феньки rewrit'а (не могу сказать точно какие) работают только в
версии апача выше 1.2 - я тестировал на 1.3.20. категорию прикрутить тоже
несложно - просто соответствующих категориям регекспов налепить, убрав
modifier L (last rule) из всех окромя последнего.
> Vladimir N. Zaytcev <2:5015/116>
>>3.2. Я делаю так, как написано в примерах, но переменные, передаваемые в
>>скрипт, не видны. Почему?
Hачиная с PHP версии 4.1 установка register_globals по умолчанию установлена
в Off. Это означает, что к переменным переданным извне, например так
http://some.server.dom/script.php?varname=value, при такой настройке в
скрипте нельзя обращаться напрямую по имени $varname. Вместо этого надо
использовать обращение к элементам специально предопределенных следующих
массивов:
$_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER (в PHP версии от 4.1) или,
соответственно, $HTTP_GET_VARS, $HTTP_POST_VARS, $HTTP_COOKIE_VARS,
$HTTP_SERVER_VARS (в любых версиях PHP).
При этом обращение к переменной приведенной в примере выше будет выглядеть
так:
$_GET['varname'] или $HTTP_GET_VARS['varname']
> Serge V. Tarasov
>>3.3. Зачем теперь register_globals=off?
Это сделано для облегчения написания безопасных скриптов. При разработке
достаточно сложных проектов, когда число используемых переменных велико,
очень легко можно допустить использование неинициализированной переменной,
которая при register_globals=On может быть передана скрипту извне злобным
хацкером. Поэтому, для написания хороших скриптов, рекомендуется обращаться
к входным переменным через предопределенные массивы (при этом программист,
заранее зная, что эти переменные переданы снаружи производит соответствующие
проверки на корректность) и включить error_reporting = E_ALL (по крайней
мере, на этапе написания и тестирования скрипта) для того, чтобы PHP
предупреждал о использовании неинициализированных переменных.
Безусловно, возможно написание хороших и безопасных скриптов и при
register_globals=On, но:
- это требует значительно более внимательного подхода к написанию;
- эти скрипты не будут корректно работать на хостинге, где
register_globals=Off (в отличие от скриптов, написанных для
register_globals=On, которые будут корректно работать везде);
ВHИМАHИЕ!
- возможно, что из будущих версий PHP register_globals будет исключен вообще.
>Serge V. Tarasov
>>3.4. У моего хостера стоит register_globals=off, как можно включить
>>register_globals программно?
Так как, вероятно, в следующих версиях register_globals уберут совсем и
поведение PHP будет таким, как при register_globals=off, то рассмотрим этот
вопрос под другим углом.
Поскольку существует множество уже используемых скриптов (надежных и не
очень), которые написаны в расчете на register_globals=On, то добавлением
нескольких строк кода заставим скрипт работать.
В общем случае, надо из предопределенных массивов $_GET, $_POST, $_COOKIE,
$_SESSION, $_SERVER (или какие вам нужны) импортировать значения в переменные
с именами элементов. Hапример так (для переменных получаемых по GET):
while (list($name, $value)=each($HTTP_GET_VARS)) {
if(isset($$name)) continue;
$$name=$value;
}
?>
или, лучше так:
extract($HTTP_GET_VARS);
extract($HTTP_POST_VARS);
extract($HTTP_COOKIE_VARS);
extract($HTTP_SESSION_VARS);
extract($HTTP_SERVER_VARS);
?>
Естественно, это негативно сказывается на безопасности, поскольку после
выполнения такого кода у вас станут глобальными все переменные переданные
снаружи (нужные и ненужные), т.е. это все равно, что сделать
register_globals=On.
> Serge V. Tarasov
>> 3.5. Hастраиваем PDFLib для работы с кириллицей. (Windows)
Внимание!!! Опыты проводились с PDFLib 4.0.2 / PHP 4.3.2 / Apache 2.0.46 /
Windows 2000
1) В директории, где установлен PHP - есть папка "pdf-related".
Открыть эту папочку, найти файл "pdflib.upr".
Открыть файл "pdflib.upr" каким нибудь редактором.
Заменить строку:
%//home/tm/src/pdflib/fonts
на
/d:/path/pdf-related
Где: d - буква диска, а path/pdf-related - путь к папке "pdf-related"
2) Теперь обозначит путь к файлу настроек "pdflib.upr":
а) Можно создать системную WIN-переменную:
PDFLIBRESOURCE d:/path/pdf-related
б) Можно в PHP-скрипте указать явным образом путь к "pdflib.upr":
3) ENJOY!!! :-)
> Igor Rulyov, info(c)de-kar.ru
-----------------------------------------------------------------------------
>>>>4. Работа с базами данных
-----------------------------------------------------------------------------
>>4.1. При выборке из базы не правильно сортирует русские буквы.
Если есть возможность, то запустите mysqld с опцией:
--default-character-set=cp1251, если нет, то попробуйте послать MySQL такой
запрос: SET CHARACTER SET cp1251_koi8 - это изменит набор символов для
текущего соединения. SET CHARACTER SET DEFAULT - установит обычную таблицу
символов.
Имейте ввиду, что эта настройка действует только для текущего соединения. Более
подробно в RTFM.
> trent
--- GMT v1.04beta5
* Origin: Two Beer Or Not Two Beer? (2:5012/8.13)
При переходе по баннеру - скидка 25% на первый месяц обслуживания! При переходе по баннеру - скидка 25% на первый месяц обслуживания!