Дон Карлос (kastaneda) wrote,
вероятность того, что я незнакомого человека в аське не обматерю - одна миллионная.
но сегодня кому-то повезло, и я даже этому кому-то чем-то помог.

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

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! ;)
Tags: ggg, mine, webdev
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded  

  • 0 comments