Я ослабел (ц).

Парни, мне нужна помощь в nginx + php-fpm (дадада!).
Проблема детская и, вероятно, классическая — буферизированый вывод из скрипта (оно же — first byte). Я не понимаю, куда копать.
Есть скрипт, который печатает цифирьки через sleep(1). Под опачем оно, разумеется, отдает в браузер буковки поштучно, с задержкой. Под nginx+fpm — складирует в буфер, и вываливает все скопом.
Какой контакт нажимать? Найденный в сети вариант с уменьшением fastcgi_buffers мне решительно не нравится.

Глобально — задача отдать статическое начало странички сразу, а остальное — по мере выполнения скриптика.

Tagged with →  

32 Responses to Я ослабел

  1. Naref:

    Нет. Тупо оптимизировать толстый сайтик под поисковых роботов, чтобы их не плющило от pending.

  2. AmtEkb:

    Найти в php-fpm параметр, запрещающий буферизацию вывода?
    Делать flush()?
    Использовать phpdaemon / python / ruby?

  3. SisYes:

    Так эта хуйня же из-за кеш буфера nginx

  4. WebDev:

    > Глобально — задача отдать статическое начало странички сразу, а остальное — по мере выполнения скриптика.

    некорректная задача изначально и проблемы начались

  5. SKEVelo:

    как-то тоже пытался такое сделать (тяжелая операция выполнялась долго), потом забил и сделал асинхронно (форкаем крипт, тот пишет в БД лог своей работы, а на странице пользователя аджаксом этот лог обновляется).

  6. Naref:

    Оно там и так запрещено. Косяк на стыке.

  7. Naref:

    Вот и интересно, как его обойти малой кровью.

  8. Naref:

    В моем случае — не вариант.

  9. Naref:

    Stephan-V: Какая есть. Мне это тоже не нравится, но вот такое требование заказчика.

  10. SisYes:

    nginx: proxy_buffering off;
    php: output_buffering = Off

  11. Naref:

    У fpm ob всегда Off. proxy_buffering — хорошая идея, но не про fastcgi.

    Есть плохое подозрение, что я обломаюсь.

  12. XibZZ:

    обломаешься. Можно только 1 раз отдать все, что накопилось в буферах (fastcgi_finish_request()), ну и все, уехали. Можно извратиться — например, отдавать (рандомное) имя файла, fastcgi_finish_request, писать в файл все дела и поллить аяксом.

  13. Naref:

    Если б я мог аякс — я б не заморачивался бы вообще 🙂
    У меня есть туча страниц, середина в которых дергается из базы (фактически, это поисковая выдача по большой базке). Запросы в базу могут тупить секунды на 3-4. Кэшировать ее низя по определенным причинам.

    Вобщем, ясно. Похоже, придется перепиливать архитектуру. Программистам будет чем заняться.

  14. WebDev:

    обычно заказчик требует, чтобы решалась какая-то практическая задача, а не чтобы ты реализовывал что-то противоестественное, разве нет?

  15. Naref:

    Stephan-V: На самом деле задача — вполне себе практическая. Ужать по всему сайту время до получения пресловутого first byte — потому как остальные SEO-ориентированные вещи уже сделаны. Более того — подход сам по себе разумен, ибо это дешевле, чем перепиливать всю архитектуру.

  16. WebDev:

    в нгинксе алгоритм наггла выключен?

  17. Naref:

    Stephan-V: Включен по-дефолту, но! У меня выключен keepalive.

  18. WebDev:

    как связано это и кипэлайв?

  19. KapCap:

    Stephan-V: http://nginx.org/ru/docs/http/ngx_http_c
    Опция включаются только при переходе соединения в состояние keep-alive.

  20. WebDev:

    ха, а там размер буфера фиксированный, оказывается, и равен postpone_output 1460; по дефолту: http://highload.com.ua/index.php/2009/10

  21. KapCap:

    Stephan-V: 1 пакет

  22. Naref:

    Stephan-V: Кстати вот отвлеченная мысль, про другое — надо посмотреть, как оно себя ведет с джумбами.

  23. WebDev:

    да, максимального размера чтобы влез в 1 кадр

  24. KapCap:

    Stephan-V: ага. а почему «ха»?

  25. WebDev:

    потому, что это значит, что отправлять порциями, которые возвращает php не получится никак

  26. KapCap:

    Stephan-V: ааааа. действительно ха ))))

  27. AmtEkb:

    ой, я дебил 🙂

  28. AmtEkb:

    а, не вчитался. Получается, проблема в nginx?

  29. XibZZ:

    Слушай, но если задача только в том, что надо отдать часть странички, чтобы робот понял, что данные идут, и дождался — заюзай SSI. Шапку статикой, запрос к php — в инклюд.

  30. XibZZ:

    ну или если в ssi буферизация не отключаема (я тут не уверен) — http://wiki.nginx.org/HttpEchoModule

    там точно есть flush

  31. Naref:

    Да ровно так и буду делать. Проблема в том, что это — с неделю кодинга. Там такие авгиевы конюшни — мама не горюй.

Добавить комментарий