За последние 24 часа нас посетили 18463 программиста и 1606 роботов. Сейчас ищут 915 программистов ...

Ответ от PHP без HTTP заголовков

Тема в разделе "Прочие вопросы по PHP", создана пользователем vikingmrboo, 8 ноя 2013.

  1. vikingmrboo

    vikingmrboo Новичок

    С нами с:
    8 ноя 2013
    Сообщения:
    6
    Симпатии:
    0
    Очень часто встречаюсь с проблемой, когда для реализации простого ответа, приходится использовать другой язык.
    Суть проблемы: при закрытии основного буфера, php отправляет все заготовленные заголовки ( HTTP/1.1 200 OK\r\nContnet-Type:...\r\n\r\n), а требуется в ответе вывести некую строчку, на пример "OK". Пару дней спрашивал гугл, умеет ли php как perl не выводить http заголовки. Все что приводилось в примерах, не работает для php-fcgid.
    Придется вкомпиливать что-то свое, реализовать на другом языке, или все таки PHP умеет не отправлять заголовки?
     
  2. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    наверное можно заставить. хз как.

    почему такая хитрость потребовалась? на том конце не понимают http?
     
  3. vikingmrboo

    vikingmrboo Новичок

    С нами с:
    8 ноя 2013
    Сообщения:
    6
    Симпатии:
    0
    Умеют только спрашивать по HTTP, а парсить заголовки не хотят. Но есть еще одна задача. Раз в 20 сек отправлять HTTP/1.1 102 Processing. А после первого же flush(), пыха отправляет \r\n\r\n
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    как-то это нездорово =)
     
  5. vikingmrboo

    vikingmrboo Новичок

    С нами с:
    8 ноя 2013
    Сообщения:
    6
    Симпатии:
    0
    Да не, норм. Обработка до минуты занимает, а cgid убивает процесс, если он молчит больше 20сек, по урлам это исправлять нельзя, а для всего сервера - слишком жирно, в общем, не просто так у нас 20 сек выставлено. По сему, слать каждые 10 - 15 сек "Я еще живой" - норм
     
  6. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну можно делать новый запрос каждые 15с
    или паузить скрипт, или выставить ему ограничение в 0
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    А вы что выводите заголовки? А не проще после удачно попытки выводить этот ОК как текст? В случае ошибки выводить NO.
     
  8. vikingmrboo

    vikingmrboo Новичок

    С нами с:
    8 ноя 2013
    Сообщения:
    6
    Симпатии:
    0
    мне то, конечно проще :) Ну это не столь важно как заставить cgi не убивать процесс, который находится в обработке. max_execution_time(null) не помогает, так как это дочерний процесс, родитель которого убъет его, в случае если не будет никакгого ответа, в заданный период времени(20 сек). Но при выдаче ответа, вываливаются все заготовленные заголовки, с разделителем блока заголовков(второй eol), и все что пишется дальше, браузер воспринимает как контент

    Добавлено спустя 2 минуты 11 секунд:
    выход для отображения статусу клиенту, а нужно немного другое. Чтобы родительских процесс не грохал ребенка, который еще жив. На клиента пофигу по большому счету :)
     
  9. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    выставить ограничение времени исполнения в ноль и будет вечный пхп.
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Что-то я подозреваю, что человек пытается на php натуральный сервер написать. Чтоб он висел в памяти, як демон, ждал запроса, и отдавал в ответ что-нибудь. А ещё я подозреваю, что php для таких задач не предназначен
     
  11. vikingmrboo

    vikingmrboo Новичок

    С нами с:
    8 ноя 2013
    Сообщения:
    6
    Симпатии:
    0
    нельзя. родитель все равно шлепнит процесс если он не ответит за 20 сек. Но вечный пхп мне тоже не нужен. Эта настройка меняется только для всего сервера, что не есть секъюрно. есть только 1 урл, на котором может долго обрабатываться запрос. Остальные должны работать в штатном режиме, со всеми онраничениями.

    Не, не пытаюсь. Пытаюсь за 1 запрос от клиента, поговорить еще с 2мя апи, которые медленные, но живые. И они то как раз, переодически шлют 102, вот хотел узнать, может ли php так делать
     
  12. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если вы не можете контролировать родителя, то блин что у вас там творится? =)))))))

    сделай поддомен. более того, можно менять извнутре пхп-скрипта, если разрешено, короче задача неясна.
    может, но так никто не делает. тут даже не в пхп проблема, а в том, что браузер так не делает. он рвет связь после 30 секунд тишины.

    делают так:
    пхп работает, запускается как-то либо демоном-родителем, либо по крону, и обновляет статус задачи.
    браузер аяксом опрашивает статус раз в несколько секунд (раз в три допустим) и рисует красоту юзеру.
     
  13. vikingmrboo

    vikingmrboo Новичок

    С нами с:
    8 ноя 2013
    Сообщения:
    6
    Симпатии:
    0
    Добрый день. У меня не fast-cgi, у меня http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
    Остановился на кривом решении, отдать все заголовки, а потом, периодически слать пробел для ответа json. Работает, но как то не красиво. Хотелось бы конечно с 102м заголовком.
    По RFC допускается второй \r\n, если заголовок множественный (как 102й, например). Но так как я не отдал Content-Length, апаче сам превращает ответ в chunked, и не дает это поменять из php, Что превращает
    Код (Text):
    1. file_put_contents('php://output', "HTTP/1.1 102 Processing\r\n");flush();
    в
    Код (Text):
    1.  
    2. {len}
    3. HTTP/1.1 102 Processing
    4. ...
    5. {len}
    6. HTTP/1.1 200 OK
    7. {len}
    8. ...
    9. 0
    Разумеется, браузер от такого в шоке и считает это контентом. В общем, php без бубна не для таких задач.

    Вот основной вопрос и есть, как, если может :) Я не про браузер говорю, хотя хром тоже нормально понимает 102й заголовок. Бракзер у меня на веб сокките висит, с ним то проблем нет. У меня проблема, чтобы апаче не рубил пхпшных детей которые еще живы.
     
  14. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Удачи!