За последние 24 часа нас посетили 20217 программистов и 1010 роботов. Сейчас ищут 373 программиста ...

Перехват php://stdout

Тема в разделе "PHP для профи", создана пользователем Ridzhi, 1 июл 2016.

  1. Ridzhi

    Ridzhi Новичок

    С нами с:
    1 июл 2016
    Сообщения:
    12
    Симпатии:
    0
    Есть код, который нельзя менять
    PHP:
    1. // STDOUT - php://stdout
    2. fwrite(STDOUT, $data);
    Код выполняется в CLI. Необходимо перехватить управление выводом указанного потока, проще говоря не надо выводить в консоль, надо сохранить вывод в файл например. Гугл сказал думать в сторону
    `stream_wrapper_register`, я попробовал написать такое, но результат ноль.
    PHP:
    1. class PhpStream
    2. {
    3.  
    4.     public function stream_write($data)
    5.     {
    6.         file_put_contents( __DIR__ . '/storage', $data);
    7.     }
    8.  
    9. }
    10.  
    11. stream_wrapper_register('php', 'PhpStream');
    12.  
    13. fwrite(STDOUT, 'test'); //все равно пишет в консоль
    Че делать ?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Нет контроля над данными которые выводятся в консоль?
     
  3. Ridzhi

    Ridzhi Новичок

    С нами с:
    1 июл 2016
    Сообщения:
    12
    Симпатии:
    0
    Не понял вопроса, можно поподробней ?
     
  4. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Добавить потоковый фильтр для STDOUT.
    PHP:
    1. class balckhole_filter extends php_user_filter {
    2.   function filter($in, $out, &$consumed, $closing)
    3.   {
    4.     while ($bucket = stream_bucket_make_writeable($in)) {
    5.        file_put_contents('out.txt', $bucket->data, FILE_APPEND);
    6.     }
    7.     return PSFS_PASS_ON;
    8.   }
    9. }
    10.  
    11.  
    12. stream_filter_register("balckhole", "balckhole_filter");
    13.  
    14. $filter = stream_filter_prepend(STDOUT, "balckhole");
    15.  
    16. fwrite(STDOUT, "bla bla bla\n");
    17.  
     
  5. Ridzhi

    Ridzhi Новичок

    С нами с:
    1 июл 2016
    Сообщения:
    12
    Симпатии:
    0
    Рабочий вариант, респектую ). А то что я написал что с этим не так ?
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    ты не навешиваешь на нужный поток
     
  7. Ridzhi

    Ridzhi Новичок

    С нами с:
    1 июл 2016
    Сообщения:
    12
    Симпатии:
    0
    Так в чем ошибка то, объясни с подробностями пжлста.
     
  8. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    STDOUT это уже открытый поток вывода, а твой вариант работает для потоков которые будут отрываться используя fopen('php://stdout', 'w');
     
  9. Ridzhi

    Ridzhi Новичок

    С нами с:
    1 июл 2016
    Сообщения:
    12
    Симпатии:
    0
    Ясно, спасибо. Доки по стримам ну очень бедные.
     
  10. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Чому не php index.php > somedump.txt и построчно читать ?
     
  11. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Похоже кто - то просто не знает, что такое потоки и как с ними работать. :)