(no subject)

Wednesday, September 29th, 2004 15:40
kastaneda: (Default)
[personal profile] kastaneda
вероятность того, что я незнакомого человека в аське не обматерю - одна миллионная.
но сегодня кому-то повезло, и я даже этому кому-то чем-то помог.

сильно странный (как для меня) чат-лог прилагается.

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/script.php?id=123&module=abc'));
   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=123') на работает? так?

тогда попробуй join('', file(http://www.livejournal.com/users/olca/31797.html) ).

если и это работать не будет -- проверь, разрешенаи в конфиге 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&tab=wi&q=');
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.php#faq.html.arrays

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! ;)
(will be screened)
(will be screened if not validated)
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

September 2025

M T W T F S S
12345 67
891011121314
15161718192021
22232425262728
2930