но сегодня кому-то повезло, и я даже этому кому-то чем-то помог.
сильно странный (как для меня) чат-лог прилагается.
22:03:00 [----] 70408926:
привет! по PHP можно спросить? :)
01:03:09 [----] 109883734:
гм... ну, спроси, --- может, что толкового отвечу :)
01:03:54 [----] alexf:
вопрос - как загружать результаты работы других PHP скриптов в строку?
01:04:34 [----] 109883734:
...то есть -- результат работы?
вывод php-скрипта, доступного по http?
01:05:05 [----] alexf:
например у меня есть скрипты index.php и script.php
мне из первого скрипта надо запустить второй (с параметрами) и то что он выдаст - получить в виде строки...
01:06:27 [----] 109883734:
гм... если я правильно понял...
<?php
// index.php
$page=join('',file('http://myhost.com/s
echo $page;
?>
01:07:37 [----] alexf:
ну как?
01:10:35 [----] 109883734:
то есть - "ну как?" :)
из одного PHP-скрипта ты можешь вызвать другой всего тремя вариантами: через запрос к своему же веб-серверу, через include() или через exec(). всё остальное сводится к этим трём вариантам.
если тебе надо получить вывод другого скрипта, исполняющегося на веб-сервере, то достаточно использовать file(), fopen() и т.п. -- при этом передаёшь все параметры в URL, который открываешь через тот же file()
01:11:02 [----] alexf:
о! уже один новый способ узнал :)
01:11:16 [----] 109883734:
какой из трёх новый? :)
01:11:19 [----] alexf:
exec
01:11:46 [----] alexf:
через file() пробовал, с этого я начал - не работает
01:12:15 [----] alexf:
Пытался делать так: $str = file_get_contents("script.php?param=1");
01:14:34 [----] 109883734:
для того, чтобы exec() работал, требуется:
1) php-cli (тот же php, сборка для command-line interface)
2) корректно настроенный скрипт (под unix - начинающийся с #!/usr/bin/php и с chmod +x, под windows - с зарегистрированным расширениме, например, ".php")
кстати, file_get_contents() может не работать
01:14:34 [----] 109883734:
. я не уверен, но может так оказаться, что эта ф-ция работает только для настоящих файлов (и не работает для PHPшных потоков ввода/вывода, вроде http://)
01:15:06 [----] alexf:
если передавать как параметр статический URL, то всё ок
01:15:15 [----] alexf:
а если скрипт - то нет
01:17:25 [----] gray:
гм. то есть, file_get_contents('something.html') работает, а file_get_contents('some-script.php?arg=1
тогда попробуй join('', file(http://www.livejournal.com/users/o
если и это работать не будет -- проверь, разрешенаи в конфиге PHP опция allow_url_fopen
01:17:53 [----] alexf:
allow_url_fopen проверял - On
01:19:02 [----] gray:
ага. ну тогда попробуй чем-то, кроме file_get_contents(). это достаточно новая ф-ция, она появилась (если не путаю) только в php 4.3.0, и (в принципе) с ней возможны глюки (багофичи :)
01:19:18 [----] gray:
то есть, попробуй fopen(), file() и так далее.
01:19:21 [----] alexf:
file() пробовал, таже фигня
01:19:39 [----] alexf:
оно вообще то должно работать или нет?
01:20:27 [----] gray:
тогда -- действительно странно...
попробуй протестировать на чём-то вроде <?php echo join('',fopen('http://google.com')); ?> (url по вкусу)
01:20:42 [----] alexf:
момент
01:22:00 [----] alexf:
Warning: fopen() expects at least 2 parameters, 1 given in C:\Fast\www\test.php on line 1
01:22:07 [----] alexf:
какой-то глюк :)
01:22:31 [----] alexf:
а! массив пустой вернулся!
01:22:49 [----] alexf:
то есть ровно то что я и раньше имел
01:23:59 [----] alexf:
или нет?
01:24:15 [----] alexf:
$str = file('http://google.com');
print_r ($str);
это работает
01:25:36 [----] gray:
гм...
fopen(), действительно, требует два параметра. первый - имя файла, второй - режим доступа.
для работы через fopen(), лучше делать (примерно) вот так:
<?php
$f = fopen ("http://google.com/", "r");
while (!feof ($f)) {
$buffer = fgets($f, 4096);
echo $f;
}
fclose ($f);
?>
01:26:28 [----] alexf:
Resource id #2 и так 13 раз в одну строку
01:27:02 [----] gray:
ой, я тормоз.
замени строку "echo $f;" на "echo $buffer;"
01:27:14 [----] alexf:
я попробовал
$str = file('http://www.google.com/imghp?hl=en&t
print_r ($str);
Оно вроде пашет, но почему с моего localhost такое-же не работает?
01:27:46 [----] alexf:
теперь работает
01:27:59 [----] gray:
так!
ты обращаешься на http://localhost/script.php?чтотота
01:28:10 [----] gray:
если да, то это надо подправить.
01:28:10 [----] alexf:
и так и сяк пробовал
01:29:32 [----] gray:
попробуй так:
<?php
print_r(file( 'http://'. $_SERVER['HTTP_HOST'] .'/path/to/script.php?arg=123' ));
(то есть, указать хост в запросе)
01:31:41 [----] alexf:
заработало! :)
01:32:05 [----] alexf:
млин, чего ж там раньше то было?
01:33:37 [----] gray:
ф-фух. ну что ж, хоть что-то полезное сделал :))
глюк, скорее всего был из-за того, что у Апача (или кто у тебя веб-сервер) было больше, чем один VirtualHost. при попытке сопоставить hostname и каталог, который DocumentRoot, вылазило что-то неправильное (где нет нужного скрипта).
может, я и ошибаюсь, но... работает - хорошо :)))
01:33:51 [----] alexf:
да, апач
01:33:57 [----] alexf:
большое спасибо! :)
01:34:12 [----] alexf:
так... надо ещё чего-нить спросить :)
01:34:56 [----] gray:
не за что :)
если спрашивать -- то или более-менее оперативно, или завтра. потому что я сейчас пойду курить, а потом завалюсь дрыхнуть... :)
01:35:20 [----] alexf:
всё, точно заработало! file_get_contents тоже работает
01:35:31 [----] alexf:
ещё раз большое спасибо!
01:36:17 [----] alexf:
вот такой вопрос - как на одну страницу запихать много форм и их обрабатывать? если обработчики сидят в разных php файлах?
01:41:36 [----] gray:
ага. значит, зря я за file_get_contents() беспокоился. а то ходили слухи, что для повышения скорости оно будет работать "напрямую".
ещё раз --- не за что. ;)
несколько форм -- это сложнее. дело в том, что ты можешь сделать submit только одной формы. поэтому на практике применяются следующие варианты:
1) несколько форм, каждая указывает (<form action=...>) на свой обработчик. при этом, обработчик получает данные только из "своей" формы.
01:41:36 [----] gray:
2) одна громадная форма с несколькими <input type=submit>. соответственно, один универсальный обработчик.
(краткий пример, как сделать несколько submit'ов:
в HTML:
<input type="submit" value="Сохранить изменения" name="action[save]">
<input type="submit" value="Предварительный просмотр" name="action[preview]">
в обработчике (PHP):
$action=@$_REQUEST['action'];
if(is_array($action)) @list($action)=array_values($action);
01:41:36 [----] gray:
if($action=='save') {
// ....
} elseif($action=='preview') {
// .....
}
01:42:08 [----] alexf:
то есть все Submit-кнопки одним именем называть?
01:42:17 [----] gray:
не совсем.
01:42:29 [----] alexf:
я просто в PHP пока чайник, учусь :)
01:42:36 [----] alexf:
а как?
01:43:28 [----] alexf:
я кстати понял, почему не работала загрузка - надо указывать абсолютный путь на сервере, а я пытался использовать относительный - относительно запускающего скрипта
01:47:07 [----] gray:
можно назвать все одним именем.
тогда, если у нас была нажата кнопка вида
<input type=submit name=foo value=bar>
то в $_REQUEST['foo'] будет 'bar'.
соответственно, если надписи на кнопках километровые и на "нормальном" языке, то удобнее передавать значение не через value, а через name.
если что -- почитай, как из форм массивы передавать, вот здесь:
http://www.php.net/manual/en/faq.html.p
01:47:07 [----] gray:
а по поводу относительного и абсолютного пути... ну, хорошо, что разобрался :) веб-сервер не знает, какой текущий каталог у клиента, который запрашивает с него страницу :)
01:47:25 [----] alexf:
угу :)
01:47:43 [----] alexf:
ты вообще давно этим делом занимаешься?
01:48:49 [----] alexf:
я по аське несколько человек с интересами PHP нашёл, но мало кто понял в чём проблема, никто правильно не сказал что делать :)
01:49:27 [----] gray:
окей. удачи с PHP, это классный язык :)
а я буду потихоньку сваливать.
про меня и php. не сильно давно, более-менее активно -- с начала 2001-го, до этого понемногу ковырял из любопытства. на самом деле, это не так уж и важно. главное -- особо фигни не делать, и стараться понимать, что происходит во время работы скрипта.
01:50:25 [----] alexf:
ладно, у вас там ночь уже :) спасибо! пока!
01:50:56 [----] gray:
а про чуваков в аське... ну, это общая проблема. обычно люди не готовы говорить о том, что они написали в своих интересах -- заняты, нет времени, нет настроения... а у меня было настроение про это поболтать, так что тебе повезло (а я интересно провёл время).
окей. good byte! ;)