pg_dump из php-скрипта с указанием host приводит к зависанию

Develar

Новичок
pg_dump из php-скрипта с указанием host приводит к зависанию

PHP:
<?php

$handle = popen('pg_dump --host="192.168.0.66" --username="postgres" --file="/tmp/test.sql" test', 'w');
fwrite($handle, "password\n");
pclose($handle);

?>
Windows XP SP2, PostgreSQL 8.3 Beta 1. Выполнение скрипта останавливается на popen. 192.168.0.66 это адрес моей машины, с которой я и запускаю скрипт. СУБД на этой же машине. Из консоли (cmd.exe) команда выполняется без проблем, из php-скрипта только если убрать --host или указать его равным localhost - в чем может быть дело (в этом варианте http://ru2.php.net/manual/en/function.proc-open.php#69530 та же проблема)?
 

MiksIr

miksir@home:~$
Из шела команда с --host тоже?
Все ж очень похоже что pg_dump пароль хочет - проверьте настройки trusted авторизации.
 

Develar

Новичок
>> Из шела команда с --host тоже?
Да.

>> Все ж очень похоже что pg_dump пароль хочет - проверьте настройки trusted авторизации.
Да, вы правы, если без host, но с указанием password для force password prompt (should happen automatically) то та же песня.

Значит вопрос - что неправильного в моем коде (вроде ведь логически все правильно?) и неправильного в коде на http://ru2.php.net/manual/en/function.proc-open.php#69530 что не передается пароль?
Задача в том, что надо передавать пароль именно через ввод, а не http://www.postgresql.org/docs/current/static/libpq-pgpass.html или pg_hba.conf
 

MiksIr

miksir@home:~$
Ну, в общем pg_dump ждет пароль не со стандартного инпута, а открывает отдельный сокет (по крайней мере так на линуксе). Не знаю зачем он это делает и как обойти (особо на виндовс).
 

Develar

Новичок
MiksIr, ясно, спасибо, будем копать. В крайнем случае можно будет опустить руки и на время запуска создавать файл .pgpass в windows, а в linux наверняка получится и так.
 

MiksIr

miksir@home:~$
В линукс не получится... легко проверяется echo 123 | pg_dump -W ...
Дело в том, что pg_dump не ждет ввода с stdin, как я сказал, а делает open(/dev/tty) и читает "нажатия клавиш" с терминала... приблизительно так. В эту область, как перехватывать такие весчи, я не вникал, и думаю что писать .pgpass а потом его удалять - наиболее гибкое решение ;)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Develar
shell> command for dump > /dump_file_name.sql
 

Develar

Новичок
Mr_Max
Так и дурак сможет, а нам надо и пароль передать.

Все просто - пятый параметр proc_open это array('PGPASSWORD' => 'password') и все. Всем спасибо.
 

MiksIr

miksir@home:~$
Безобразие, а в манах нет ничего про эту переменную окружения ;)
 

Develar

Новичок
MiksIr, есть, http://www.postgresql.org/docs/current/static/libpq-envars.html

Но лучше в windows об этом не знать :( Команда Set в windows воспринимает экранирующие кавычки как часть устанавливаемого значения...
 
Сверху