Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Войти
 
Страницы: 1
RSS
apache+php не то передается в cgi скрипт, после обновления до php 5.2.2
 
Связка apache+php+mysql+zlib.
Обновила php c 4.4.6 до 5.2.2. Произошли неприятные изменения.

FreeBSD 6.1, Apache 1.3.37 Rus lexa, Php 5.2.2:
Phpinfo() в вызываемом cgi-скрипте показывает, что в него передаются следующие аргументы - имя вызываемого скрипта вместо параметров.

_SERVER["argv"] => Array ( [0] => /usr/home/sktel/www/modulenews/modules/cgi/news.cgi ) _SERVER["argc"] => 1
Причем присутствует только argv[0], a argv[1] не заполняется вообще, так что даже ручками не скормишь!

А было (FreeBSD 5.4, Apache 1.3.29 Rus lexa, php 4.4.6) – рабочий вариант:
_SERVER["argv"] Array ( [0] => template=v2_news_main&cnews=3&servername=sktel.com.ua )
_SERVER["argc"] => 1

Ну в общем,  в версиях php имеются разногласия во взглядах на argv[0]

Такой грабль уже был с php 4.3 (FreeBSD 5.4, Apache 1.3.29), помогло обновление до 4.4.6. Теперь «обстаряться» до 4.4.6 не хочется. Как с этим бороться? Может есть какие-нибудь настройки в php, apache и т.п.?
 
Вот этот ключик в php.ini:
---------------
; Enable compatibility mode with Zend Engine 1 (PHP 4.x)
zend.ze1_compatibility_mode = On
----------------
не помогает? У меня были проблемы (серьёзные) с работой скриптов, работающих в PHP4 на PHP5, но не до такой степени.
 
Цитата
Jul_i пишет:
Ну в общем, в версиях php имеются разногласия во взглядах на argv[0]
Хм. Судя по документации ничего не изменилось:

'argv'
Array of arguments passed to the script. When the script is run on the command line, this gives C-style access to the command line parameters. When called via the GET method, this will contain the query string.
'argc'
Contains the number of command line parameters passed to the script (if run on the command line).


Когда PHP запускается из командной строки, то в argv-список аргументов, когда параметры передаются с помощью метода GET - в argv строка запроса. В PHP4 все тоже самое:

http://1.2.3.4/info.php?preved=123&medved=asd

PHP Version 4.3.10-15
<...>
_SERVER["argv"]
 Array
(
   [0] => preved=123&medved=asd
)
 _SERVER["argc"] 1
<...>


Непонятно зачем вообще использовать в скриптах argc/argv? Обычно используют $_POST["cnews"], $_GET["cnews"] или $_REQUEST["cnews"] + isset() вместо того, чтобы вручную парсить массив argv...
как вариант для эмуляции массива argv можно использовать  $argv=explode("&",implode($_SERVER["argv"]))) или $argv=explode("&",$_QUERY_STRING);
 
а если подумать головой, то все правильно.
 
PHP Version 5.2.0-8+etch7

_SERVER["argv"] Array
(
   [0] => preved=123&medved=asd
)
_SERVER["argc"] 1

Все то же самое...
 
Конфиг php.ini в 4-й и 5-й версии сильно отличаются. Тут может копать надо. Предлагаю выложить оба конфига.
Хочешь быть мудрым? Не желай всего, что видишь; не верь всему, что слышишь; не говори всего, что знаешь; не делай всего, что умеешь, а только то, что полезно.
 
Если вызывать PHP как CGI(http://1.2.3.4/cgi-bin/info.cgi?preved=123&medved=asd) все то же самое:

phpinfo()
PHP Version => 4.3.10-22
<...>
_SERVER["argv"] => Array
(
   [0] => /usr/lib/cgi-bin/info.cgi
)
_SERVER["argc"] => 1

phpinfo()
PHP Version => 5.2.0-8+etch7

<...>
_SERVER["argv"] => Array
(
   [0] => /usr/lib/cgi-bin/info.cgi
)
_SERVER["argc"] => 1
 
А у меня на Gentoo 2 версии PHP cтоит - 4 и 5 (в слотах). При необходимости включаю или одну или другую. ;) Через conf-файл Апача.
 
Цитата
SOLDIER пишет:
zend.ze1_compatibility_mode = On
не помогает
Цитата
SOLDIER пишет:
Непонятно зачем вообще использовать в скриптах argc/argv? Обычно используют $_POST["cnews"], $_GET["cnews"] или $_REQUEST["cnews"] + isset() вместо того, чтобы вручную парсить массив argv... как вариант для эмуляции массива argv можно использовать $argv=explode("&",implode($_SERVER["argv"]))) или $argv=explode("&",$_QUERY_STRING);
Я этого и не собираюсь делать. Просто смотрела argv, чтобы выяснить причину. Оказалось, что argv[0] - единственное различие между рабочим и нерабочим вариантами. Это только предположение, что причина в нем.

Нужные параметры - template=v2_news_main&cnews=3&servername=sktel.com­.ua передаются в скрипт через несколько переменных окружения, например, $_SERVER["QUERY_STRING"]. Но скрипт их не считывает. Видимо ищет их по-старому в argv[0].

Эмуляция массива argv не помогает. Все равно phpinfo показывает не то, что я присвоила argv[0], а имя самого скрипта.

В качестве эксперимента пробовала парсить $_SERVER["QUERY_STRING"] вручную, но это нереально - в стольких местах это надо сделать - костьми лечь можно.

Конфиг РНР4 (часть, что касается модулей - пропускаю)
engine = On
short_open_tag = On
asp_tags = Off
precision    =  12
y2k_compliance = On
output_buffering = Off
zlib.output_compression=1
implicit_flush = Off
serialize_precision = 100
allow_call_time_pass_reference = On
safe_mode = Off
safe_mode_gid = Off
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 8M
error_reporting  =  E_ALL & ~E_NOTICE
display_errors = On
display_startup_errors = Off
log_errors = Off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
variables_order = "EGPCS"
register_globals = On
register_argc_argv = On
post_max_size = 8M
gpc_order = "GPC"
magic_quotes_gpc = On
magic_quotes_runtime = Off    
magic_quotes_sybase = Off
default_mimetype = "text/html"
extension_dir = "./"
enable_dl = On
file_uploads = On
upload_max_filesize = 2M
allow_url_fopen = On
default_socket_timeout = 60

Конфиг РНР5
engine = On
zend.ze1_compatibility_mode = On
short_open_tag = On
asp_tags = Off
precision    =  12
y2k_compliance = On
output_buffering = Off
zlib.output_compression = On
implicit_flush = Off
unserialize_callback_func=
serialize_precision = 100
allow_call_time_pass_reference = On
safe_mode = Off
safe_mode_gid = Off
safe_mode_allowed_env_vars = PHP_
safe_mode_protected_env_vars = LD_LIBRARY_PATH
expose_php = On
max_execution_time = 30
max_input_time = 60
memory_limit = 128M
error_reporting  =  E_ALL & ~E_NOTICE
display_errors = On
display_startup_errors = Off
log_errors = Off
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
track_errors = Off
variables_order = "EGPCS"
register_globals = On
register_long_arrays = On
register_argc_argv = On
auto_globals_jit = On
post_max_size = 8M
magic_quotes_gpc = On
magic_quotes_runtime = Off
magic_quotes_sybase = Off
default_mimetype = "text/html"
enable_dl = On
file_uploads = On
upload_max_filesize = 2M
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60
define_syslog_variables  = Off
 
Все-таки поставила php 4.4.6 (не как модуль апача, а отдельно) cgi заработали.  Апач оставила без изменения . В cgi оказывается вызывался не пхп-шный модуль апача, а отдельно стоящий пхп.   Таким образом, через cgi у меня теперь вызывается пхп 4.4.6, а во всех остальных случаях - модуль апача версии 5.5.2. Вроде работает нормально.
 
Ну вобщем-то все логично - mod_php/mod_perl для парсинга *.php и *.pl, а консольные /usr/bin/php, /usr/bin/perl которые указывается интерпретатором - для выполнения CGI ...
С php5-cli или как он так назвыается во фре тоже по идее все должно работать.
Страницы: 1
Читают тему